我正在检查我的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"
}
答案 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
。