我正在尝试使用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
或者,选择更简单的方法,例如好旧的方法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"}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句