Как проверить из вывода командлета, содержит ли он определенную строку, и вернуть успех в 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,

Другие вопросы по тегам