PowerShell相当于LINQ All,或者如何验证集合中的所有项目是否等于特定值?

时间:2014-06-30 08:51:10

标签: linq powershell

我有一个项目集合,我从正则表达式匹配中构建,如下所示:

$collection = $input | foreach {
    if ($_ -match $regex) {$matches} else { return }
} | 
  Select-Object –Property @{name='command'; expression={$_.command} },
                          @{name='id';      expression={$_.id} }

(对不起,如果这不是最好的方法,我正在学习PowerShell :))

我要做的是确保此command中的所有$collection属性都等于相同的命令,例如"myCommand",我该怎么做?

如果这是C#,我可能会做类似的事情:

if (collection.All(item => item.Key == "myCommand")) { ... }

在PowerShell中执行此操作的惯用方法是什么?

2 个答案:

答案 0 :(得分:1)

当数组中的所有项目相同时,以下代码段会返回$true。它的作用是:

  1. 使用ForEach-Object
  2. 遍历对象数组
  3. 使用Compare-Object cmdlet将每个与上一个进行比较。
  4. 如果Compare-Object至少返回一次非空值,这意味着要比较的两个对象不同,则代码段将返回$false,否则为$true

    将片段应用于数组@(1,1,1,1,1,2)将返回$false,因为最后一项。

    @(1,1,1,1,1,2) |
        ForEach-Object -Begin { $last = $null; $result = $true } {
            if ($last -ne $null -and $result -and (Compare-Object $last $_) -ne $null) {
                $result = $false
            }
            $last = $_
        } -End { $result }
    

答案 1 :(得分:0)

我被指向这个LINQ Module for PowerShell,这让我可以做到:

$collection | Linq-All { $_.command -eq "myCommand" }

这正是我所需要的!更多示例here