PowerShellWhere-Object使用方括号[]无法按预期工作

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

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

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

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

回答

这里有两个问题:

如何过滤包含的字符串 [X]

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

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

请注意,反引号也是可扩展字符串中使用的转义字符,因此如果使用双引号,则需要对括号进行双重转义:

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

或者,选择更简单的东西,比如 good old String.Contains()

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

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

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

如何过滤输出 Get-WindowsFeature

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

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

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


以上是PowerShellWhere-Object使用方括号[]无法按预期工作的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>