在将其发送到管道之前,是否可以获得Powershell命令的整个输出?

时间:2014-12-31 20:16:50

标签: powershell pipe pipeline

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

示例:

Get-ChildItem | Select -ExpandProperty "Name" | %{ $_ -Match "Desktop" }为每个文件夹返回false,但名为“Desktop”的文件夹除外。

如果这些文件夹中的任何一个文件夹名称中包含“桌面”,则只返回一个True,否则只返回一个False?我想的是:

Get-ChildItem | Select -ExpandProperty "Name" | <aggregate_cmdlet> | %{ $_ -Match "Desktop" }

3 个答案:

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