从PowerShell中的另一个ArrayList中删除ArrayList中包含的项目

时间:2018-11-12 08:11:20

标签: powershell arraylist compare

我有两个ArrayList listAlistBlistBlistA的子集。 现在,我要从listB中删除listA中包含的所有项目。

这是我的列表的样子:

Name     ID    Domain
----     --    ------
item1    456   domain1
item2    716   domain2
item3    421   domain2
item4    796   domain1
Name     ID    Domain
----     --    ------
item2    716   domain2
item4    796   domain1

我已经尝试使用

$listA = $listA | Where-Object {$listB -notcontains $_}

但这对我的数据不起作用。

1 个答案:

答案 0 :(得分:1)

您可以使用Compare-Object cmdlet进行此操作。
如果您的列表是这样的:

$listA = @()
$listA += [PSCustomObject]@{Name = 'item1' ; ID = '456'; Domain = 'domain1'}
$listA += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item3' ; ID = '421'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}

$listB = @()
$listB += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listB += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}

然后考虑所有属性,删除$listA中也属于$listB的所有对象,请执行以下操作:

$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property Name,ID,Domain).SideIndicator -eq '<=' }

此后,$listA仅剩以下两个成员:

Name  ID  Domain 
----  --  ------ 
item1 456 domain1
item3 421 domain2

修改

除了像上面那样实际命名要比较的属性外,您还可以将它们收集在变量中。对于PS版本3及更高版本,请执行以下操作:

$props = $listA[0].psobject.properties.name

3.0以下的PowerShell版本使用:

$props = $listA[0].psobject.properties | ForEach-Object { $_.name }

然后您可以将行更改为

$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }

当然,只有在两个列表具有相同的属性名称进行比较的情况下。