如何在cmdlet的输出中检查它是否包含特定字符串并在Powershell中返回成功

时间:2018-03-20 04:33:03

标签: powershell windows-server-2008-r2 smb

我正在检查我的Windows Server 2008 R2上是否启用了SMB版本1。

即使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 个答案:

答案 0 :(得分:1)

使用Get-Service可以提供更简单,更强大的解决方案:

if ((Get-Service mrxsmb10).Status -eq 'Running') {
    "SMB1 is enabled"
}
else {
    "SMB1 is not enabled"
}

如果该服务无法安装 ,请将-ErrorAction Ignore(PSv5 +)或-ErrorAction SilentlyContinue添加到{{ 1}}调用以使输出静音。

如果您确实希望坚持使用字符串解析方法,则可以简化对以下操作的尝试:

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,并且非空变量为&#,则它只是非空的34; truthy"在条件中(在任何布尔上下文中)。

RUNNING没有按预期工作,因为它不是字符串操作,而是数组包含操作,因为它调用了外部程序(如$SMBVersionRunning.Contains($SMBRunningStatus.ToString()))返回数组行。

也就是说,如果sc.exe query mrxsmb10匹配完整,则方法调用只返回$True

除此之外,您与$SMBRunningStatus.ToString()(a)的比较逻辑将-eq 0的布尔结果与.Contains()进行比较,(b)逻辑意外颠倒;要测试布尔结果是否为[int],您可以使用$True,但这不是必需的:只需按原样使用布尔结果;同样,要测试-eq $True,您可以使用$False运算符代替-not