Как проверить из вывода командлета, содержит ли он определенную строку, и вернуть успех в Powershell
Я проверяю, включена ли версия SMB1 на моем Windows Server 2008 R2.
Даже если SMB1 включен и работает, когда я выполняю сравнение цикла if, если SMB1 работает, он выполняет условие else
Может кто-нибудь сказать, пожалуйста, где я иду не так?
Вот мой сценарий:
$SMBVersionRunning = sc.exe query mrxsmb10
$SMBVersionState = $SMBVersionRunning | Select-String -Pattern "STATE"
$SMBRunningStatus = $SMBVersionState | Select-String -Pattern "RUNNING"
if( $SMBVersionRunning.Contains($SMBRunningStatus.ToString()) -eq 0)
{
Write-Host "SMB1 is enabled"
}
else
{
Write-Host "SMB1 is not enabled"
}
1 ответ
С помощью Get-Service
позволяет более простое и надежное решение:
if ((Get-Service mrxsmb10).Status -eq 'Running') {
"SMB1 is enabled"
}
else {
"SMB1 is not enabled"
}
Если есть вероятность, что сервис даже не установлен, добавьте -ErrorAction Ignore
(PSv5+) или -ErrorAction SilentlyContinue
к Get-Service
вызов, чтобы заставить замолчать вывод ошибки.
Если вы хотите придерживаться подхода анализа строк, вы можете упростить вашу попытку до следующего:
if ((sc.exe query mrxsmb10) -match 'STATE' -match 'RUNNING') {
"SMB1 is enabled"
}
else {
"SMB1 is not enabled"
}
Хотя в этом случае, вероятно, нет необходимости, вы можете сделать соответствие более строгим, ища поисковые термины только как полные слова, заключив их в \b...\b
; т.е. \bSTATE\b
а также \bRUNNING\b
Что касается того, что вы пытались:
if ($SMBRunningStatus) ...
должен дать вам то, что вы хотите, потому что это будет только непусто, если обе строки STATE
а также RUNNING
были найдены в той же строке, и непустая переменная является "истинной" в условном выражении (в любом булевом контексте).
$SMBVersionRunning.Contains($SMBRunningStatus.ToString())
не работает должным образом, потому что это не строковая операция, а операция сохранения массива, учитывая тот вызов внешней программы, как sc.exe query mrxsmb10
возвращает массив строк.
То есть вызов метода вернет только $True
если $SMBRunningStatus.ToString()
соответствует линии в полном объеме.
Помимо этого, ваша логика сравнения с -eq 0
(а) сравнивает логический результат из .Contains()
для [int]
и (b) имеет случайно измененную логику; проверить, является ли логический результат $True
, вы можете использовать -eq $True
, но это не обязательно: просто используйте логический результат как есть; аналогично, чтобы проверить $False
Вы можете использовать -not
оператор вместо -eq $False
,