Это можно сделать с помощью командлета Compare-Object
.
Если ваши списки такие:
$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
Используются версии PowerShell ниже 3.0:
$props = $listA[0].psobject.properties | ForEach-Object { $_.name }
Тогда вы можете изменить строку на
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }
Это, конечно, только если оба списка имеют одинаковые имена свойств для сравнения.