【发布时间】:2022-01-24 14:40:09
【问题描述】:
我正在尝试过滤路径中不包含字符串 "C: \ Windows" 的对象,但过滤不适用于 $_.PathName 参数。
function unquotedPath {
$unquotedPaths = Get-WmiObject -Class Win32_Service | Where-Object {$_.StartMode -eq "Auto" -and $_.PathName -notcontains "C:\WINDOWS\"} | Select-Object -Property Name,DisplayName,PathName,StartMode | Out-String
foreach ($unquotedPath in $unquotedPaths) {
Write-Host $unquotedPath -ForegroundColor Green
}
}
【问题讨论】:
-
-notcontains 是一个集合运算符。见stackoverflow.com/questions/18877580/…
-
和
| Out-String使其成为单个字符串对象... -
我使用 Out-String 来获得更好的输出格式,它不会改变过滤方式
-
简而言之:
-contains/-notcontains是 集合运算符:它们测试 LHS 对象是否完全等于与 RHS 的至少一个元素收藏。不要将它们与.Contains().NET 方法 用于子字符串匹配 混淆。虽然 PowerShell 没有用于 literal 子字符串匹配的等效运算符,但您可以将-like与 通配符表达式 或-match与 正则表达式 一起使用,两者都可以其中不区分大小写。 -
关闭与
Out-String的切线:@iRon 想说的是$unquotedPaths将收到一个 single (多行)输出字符串跨越所有过滤对象,因此您的 foreach` 循环将被输入(最多)一次。省略循环并改用Write-Host $unquotedPaths -ForegroundColor Green会产生相同的效果。
标签: powershell