【问题标题】:How to check from output of a cmdlet if it contains a specific string and return success in Powershell如何从 cmdlet 的输出中检查它是否包含特定字符串并在 Powershell 中返回成功
【发布时间】:2018-08-28 19:21:18
【问题描述】:

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

【问题讨论】:

  • 在黑暗中拍摄,但你看过Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol
  • Get-SmbServerConfiguration cmdlet 在 Windows 2008 R2 中不受支持

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


【解决方案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) ... 应该给你你想要的,因为只有当字符串STATERUNNING 都在同一行上,并且非空变量在条件(在任何布尔上下文)。

考虑到调用外部程序如sc.exe query mrxsmb10 返回一个 array 行。

也就是说,如果$SMBRunningStatus.ToString() 匹配一行完整,方法调用只会返回$True

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

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 2021-02-28
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多