PowerShell Where-Object 未按预期使用方括号 [ ]

PowerShell Where-Object not working as expected with square brackets [ ]

我正在尝试使用 PowerShell 根据关键字匹配“[X]”(字面意思是用方括号包围的 X)过滤出结果(行)

Invoke-Command -ComputerName Server1 -ScriptBlock {Get-WindowsFeature} | Where-Object {$_.DisplayName -like "*[X]*"}

结果比预期的要大。我正在获取以任何顺序或组合包含 [、] 和 X 的结果。只要所有的字符都在就行了。我正在使用不使用 Regex 的 -like。我认为那是-match 的工作。删除通配符没有帮助。

在有人问之前,为什么我不过滤 'installstate' 属性。这是一个较旧的 PowerShell 模块 运行 远程并且似乎根本 return 属性,因此我别无选择,只能寻找明确的“[X]” 谢谢

这里有两个问题:

如何过滤包含 [X]

的字符串

如评论中所述,PowerShell 中的通配符模式使用 [] 用于特殊目的(描述字符范围),因此您需要使用反引号转义括号:

PS ~> 'This string contains [X] somewhere' -like '*`[X`]*'
True

注意反引号也是可扩展字符串中使用的转义字符,所以如果你使用双引号,你需要双转义括号:

PS ~> 'This string contains [X] somewhere' -like "*``[X``]*"
True

或者,选择更简单的东西,比如古老的 String.Contains():

'This string contains [X] somewhere'.Contains('[X]')

... 或要求 PowerShell 为您转义您的参考字符串:

'This string contains [X] somewhere' -like "*$([WildcardPattern]::Escape('[X]'))*"

如何过滤来自 Get-WindowsFeature

的输出

它不起作用的原因是漂亮的树状缩进和 [X]/[ ] 指示器 实际上不是输出对象的一部分 - 它由 PowerShell 的格式化子系统强加,仅在输出列为格式化 table.

时出现

由于 [X] 表示组件已“安装”,因此对基础数据的等效查询实际上是:

Invoke-Command -ComputerName Server1 -ScriptBlock {
    Get-WindowsFeature
} | Where-Object {$_.InstallState -eq "Installed"}