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

How to check from output of a cmdlet if it contains a specific string and return success in Powershell

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

即使启用了 SMB1 并且 运行,当我进行 if 循环比较时 如果 SMB1 是 运行 那么它正在执行 其他条件

谁能告诉我哪里出错了?

这是我的脚本:

$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"
}

使用 Get-Service 可以提供更简单、更可靠的解决方案:

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

如果服务有可能甚至没有安装,请将-ErrorAction Ignore (PSv5+) 或-ErrorAction SilentlyContinue 添加到Get-Service 调用以消除错误输出。


如果您确实想坚持使用 string-parsing 方法,您可以将您的尝试简化为以下内容:

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) ... 应该给你你想要的,因为只有在字符串 STATERUNNING 都在同一行上找到时它才会是非空的,并且非空变量是"truthy" 在条件中(在任何布尔上下文中)。

$SMBVersionRunning.Contains($SMBRunningStatus.ToString()) 没有按预期工作,因为它不是 string 操作,而是 array containment 操作,假设调用了一个外部程序,例如 sc.exe query mrxsmb10 returns 一个 array 行。

也就是说,如果 $SMBRunningStatus.ToString() 完全匹配 .

,方法调用只会 return $True

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