是否可以在将 Powershell 命令发送到管道之前获取其全部输出



>命令输出多行字符串,我想确定这些行中是否有任何一行与我正在寻找的字符串匹配。

例:

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"
}

最新更新