一个命令输出多行字符串,我想确定这些行中是否有任何一行符合我正在寻找的字符串。
示例:
Get-ChildItem | Select -ExpandProperty "Name" | %{ $_ -Match "Desktop" }
为每个文件夹返回false,但名为“Desktop”的文件夹除外。
如果这些文件夹中的任何一个文件夹名称中包含“桌面”,则只返回一个True
,否则只返回一个False
?我想的是:
Get-ChildItem | Select -ExpandProperty "Name" | <aggregate_cmdlet> | %{ $_ -Match "Desktop" }
答案 0 :(得分:2)
您可以在整个结果集合中使用-match
运算符:
$ci = Get-ChildItem | Select-Object -ExpandProperty "Name"
$ci -match "Desktop"
现在,最后一个语句将返回与&#34; Desktop&#34;匹配的所有字符串。如果未找到匹配项,则不返回任何内容。
现在我们可以做到(在PowerShell 3.0及更高版本中):
$ci -match "Desktop" -as [bool]
并在一个或多个项目匹配时返回True
&#34;桌面&#34;。
以单行格式:
(ls|select -exp Name)-match"Desktop"-as[bool]
答案 1 :(得分:1)
获得所需内容的另一种方法是 -
(Get-ChildItem | Where-Object {$_.Name -ieq 'Desktop'}).Length -gt 0
答案 2 :(得分:1)
如果您将ForEach-Object
更改为Where-Object
,则可以使用其他方法来查找所需内容。目前Get-ChildItem | Select -ExpandProperty "Name" | %{ $_ -Match "Desktop" }
只是输出要输出的值的值。让我们将结果捕获到一个变量中,一个简单的If
将评估是否有任何匹配。
$results = Get-ChildItem | Select -Expand "Name" | ?{ $_ -Match "Desktop" }
If($results){
Write-Host "there is at least 1 match"
}
这可以通过删除变量altogehter来简化,但我怀疑你需要使用结果。它包括在内。
If(Get-ChildItem | Select -Expand "Name" | ?{ $_ -Match "Desktop" }){
Write-Host "there is at least 1 match"
}
我们可以使用-Filter
If(Get-ChildItem -Filter "Desktop" }){
Write-Host "there is at least 1 match"
}