【问题标题】:How to check if PowerShell pipeline returns true for each pipeline element?如何检查 PowerShell 管道是否为每个管道元素返回 true?
【发布时间】:2016-05-17 14:29:14
【问题描述】:

在 PowerShell 中,我想比较对象并在它们匹配时返回 true。最后,管道应该只返回一个布尔值 - 如果每个管道元素返回 true,则返回 true,否则返回 false。仅使用管道如何实现此目的?

例子:

@("a","b","c") | % { $_ -match "[a-z]" } # -> should only return true once
@("a","1","c") | % { $_ -match "[a-z]" } # -> should only return false once

【问题讨论】:

  • 您也可以为此使用-notcontains(@("a","b","c") | % { $_ -match "[a-z]" }) -notcontains $false 返回True。不过,这并没有使用管道。

标签: powershell


【解决方案1】:

如果您有 PowerShell 4,则可以将 Linq 与

一起使用
$data = ("a","b","c")
$testFunction = [func[object,bool]] {param($item) $item -match "[a-z]"}

[Linq.Enumerable]::All($data, $testFunction)

【讨论】:

  • 这是一个非常有趣的答案。直到现在才知道 Linq。
  • 我经常忘记它,特别是因为它不像 PowerShell 中的管道那样好用,而且做的事情大多相同。我认为一个不错的补充是Where-Object 上的-All 参数,也许-None,尽管这会隐含地颠倒条件的含义。
【解决方案2】:

如果您只想使用单个管道而不是多个语句,您可能可以这样做:

$data | % { check } | sort -unique | select -first 1

这将检查每个元素,对结果进行排序并删除重复项,因此此时唯一的结果是$false$false,$true$true。然后我们只取第一个值。如果每个元素都通过了检查,那只有$true

如果您对管道周围的其他语句或表达式没有那么不利,您可以进行收集计数检查,或反转条件然后否定结果:

!($data | ? { !(check) })

管道将返回 $null 或多个项目。然后,布尔值 not 会将其强制转换为布尔值。这种方法的唯一问题是只有一个项目与倒排检查匹配并且它相当于$false(例如,一个空字符串,或0)。

【讨论】:

    【解决方案3】:

    这是一个使用Where-Object(别名:? { ... })的示例:

    • 删除与您的条件不匹配的集合迭代。
    • 将结果集合的计数与原始集合的计数进行比较。如果没有被删除(如果都符合您的条件),则语句返回 true。

    代码:

    PS C:\> $arr = @("a","b","c")
    PS C:\> @($arr | ? { $_ -match "[a-z]" }).Count -eq @($arr).Count
    True
    
    PS C:\> $arr = @("a","1","c")
    PS C:\> @($arr | ? { $_ -match "[a-z]" }).Count -eq @($arr).Count
    False
    

    【讨论】:

      【解决方案4】:

      受其他答案的启发,我想出了另一个解决方案,它也只返回真或假

      @("a","b","c") | % { $_ -match "[a-z]" } | Measure-Object -Sum | % { $_.Count -eq $_.sum }
      @("a","1","c") | % { $_ -match "[a-z]" } | Measure-Object -Sum | % { $_.Count -eq $_.sum }
      

      【讨论】:

        猜你喜欢
        • 2018-02-11
        • 1970-01-01
        • 2016-03-26
        • 2012-11-28
        • 1970-01-01
        • 2021-04-27
        • 2012-12-17
        • 2016-12-29
        • 1970-01-01
        相关资源
        最近更新 更多