如何从 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) ...
应该给你你想要的,因为只有在字符串 STATE
和 RUNNING
都在同一行上找到时它才会是非空的,并且非空变量是"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
。
我正在检查我的 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) ...
应该给你你想要的,因为只有在字符串 STATE
和 RUNNING
都在同一行上找到时它才会是非空的,并且非空变量是"truthy" 在条件中(在任何布尔上下文中)。
$SMBVersionRunning.Contains($SMBRunningStatus.ToString())
没有按预期工作,因为它不是 string 操作,而是 array containment 操作,假设调用了一个外部程序,例如 sc.exe query mrxsmb10
returns 一个 array 行。
也就是说,如果 $SMBRunningStatus.ToString()
完全匹配 行 .
$True
除此之外,您与 -eq 0
进行比较的逻辑 (a) 将 .Contains()
的布尔结果与 [int]
进行比较,并且 (b) 意外地颠倒了逻辑;要测试布尔结果是否为 $True
,您 可以 使用 -eq $True
,但这不是必需的:只需使用布尔结果 as-is;同样,要测试 $False
,您可以使用 -not
运算符而不是 -eq $False
。