Удалить элементы, содержащиеся в ArrayList из другого ArrayList в PowerShell - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть два ArrayList listA и listB. listB является подмножеством listA. Теперь я хочу удалить все элементы, содержащиеся в 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 голосов
/ 12 ноября 2018

Это можно сделать с помощью командлета 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 '<=' }

Это, конечно, только если оба списка имеют одинаковые имена свойств для сравнения.

...