>命令输出多行字符串,我想确定这些行中是否有任何一行与我正在寻找的字符串匹配。
例:
Get-ChildItem | Select -ExpandProperty "Name" | %{ $_ -Match "Desktop" }
为每个文件夹返回 false,但名为"桌面"的文件夹除外。
如果这些文件夹中的任何文件夹的名称中包含"桌面",是否可以简单地返回一个True
,否则False
一个?我在想这样的事情:
Get-ChildItem | Select -ExpandProperty "Name" | <aggregate_cmdlet> | %{ $_ -Match "Desktop" }
您可以对整个生成的集合使用 -match
运算符:
$ci = Get-ChildItem | Select-Object -ExpandProperty "Name"
$ci -match "Desktop"
现在,最后一条语句将返回与"桌面"匹配的所有字符串。如果未找到匹配项,则不返回任何内容。
所以现在我们可以做(在PowerShell 3.0及更高版本中):
$ci -match "Desktop" -as [bool]
并让它在一个或多个项目与"桌面"匹配时返回True
。
并以单行格式:
(ls|select -exp Name)-match"Desktop"-as[bool]
另一种获得你想要的东西的方法是 -
(Get-ChildItem | Where-Object {$_.Name -ieq 'Desktop'}).Length -gt 0
如果您将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"
}