在Powershell中,如何检查一个数组中的所有项是否都存在于第二个数组中?

Gle*_*ven 13 arrays powershell

所以我想说我有这个数组:

$requiredFruit= @("apple","pear","nectarine","grape")
Run Code Online (Sandbox Code Playgroud)

我给了第二个叫做的数组$fruitIHave.如何检查是否$fruitIHave包含所有内容$requiredFruit.如果在有多个项目不要紧,$fruitIHave就像只要一切$requiredFruit是存在的.

我知道我可以迭代列表,但这似乎效率低下,是否有内置的方法来执行此操作?

JPB*_*anc 25

你尝试Compare-Object:

$requiredFruit= @("apple","pear","nectarine","grape")
$HaveFruit= @("apple","pin","nectarine","grape")
Compare-Object $requiredFruit $haveFruit
InputObject                                                 SideIndicator
-----------                                                 -------------
pin                                                         =>
pear                                                        <=

Compare-Object $requiredFruit $haveFruit | where {$_.sideindicator -eq "<="} | % {$_.inputobject}
pear
Run Code Online (Sandbox Code Playgroud)


Ryn*_*ant 14

如果您有阵列:

$requiredFruit= @("apple","pear","nectarine","grape")
$someFruit= @("apple","banana","pear","nectarine","orange","grape")
$moreFruit= @("apple","banana","nectarine","grape")
Run Code Online (Sandbox Code Playgroud)

你可以得到一个布尔结果:

'Check $someFruit for $requiredFruit'
-not @($requiredFruit| where {$someFruit -notcontains $_}).Count

'Check $moreFruit for $requiredFruit'
-not @($requiredFruit| where {$moreFruit -notcontains $_}).Count
Run Code Online (Sandbox Code Playgroud)

使用数组的计数可以防止不匹配的单个值计算为False.例如:

# Incorrect result
-not (0| where {(1,2) -notcontains $_})

# Correct result
-not @(0| where {(1,2) -notcontains $_}).Count
Run Code Online (Sandbox Code Playgroud)

使用PowerShell v3,您可以select -first 1在发现第一个不匹配时停止管道(在v2中select -first 1只允许一个对象通过,但管道的先前元素继续处理).

-not @($requiredFruit| where {$moreFruit -notcontains $_}| select -first 1).Count
Run Code Online (Sandbox Code Playgroud)