Powershell. Сравнение двух массивов Compare-Object

Очень полезным навыком является сравнение двух массивов.
На первый взгляд эта базовая задача в Powershell может сбить с толку.
Но давайте разберём ее нюансы и некоторые примеры, и все станет на свои места.
При сравнении двух массивов использование привычных операторов сравнения типа -eq и -like  не приведет к желаемому результату.
Использования операторов —in и —contains возвращает только вхождение одного объекта, что опять не соответствует нашей цели.

Compare-Object

Для такой задачи хорошо подойдет командлет Compare-Object

Указатель => говорит о том, что во втором массиве есть значения, которых нет с первом, а маркер «<=» будет указывать на объекты отсутствующие во втором массиве:

$a = ( Get-ADUser -f * | select -First 10 ).SamAccountName
$b = ( Get-ADUser -f * | select -First 5 ).SamAccountName
Compare-Object -ReferenceObject $a -DifferenceObject $b

Обязательным условием будет одинаковый тип сравниваемых данных:

Не удивляйтесь тому, что не получаете ожидаемый результат, сравнивая объект типа ADUser с объектом типа string.
ADUser — это массив, у которого обычно первой строкой стоит DistinguishedName, и если у вас в объект string случайно не записан именно DistinguishedName, то сравнение не будет выполнено должным образом.

Так же стоит помнить о том, что если оба массива идентичны, то Compare-Object не вернет совершенно ничего. Что бы убедиться что это не ошибка, и вывести на экран в том числе и совпадающие значения, используйте параметр -IncludeEqual

Можно использовать фильтр, чтобы получить только отсутствующие объекты в одном из массивов:

$a = ( Get-ADUser -f * | select -First 10 ).SamAccountName
$b = ( Get-ADUser -f * | select -First 5 ).SamAccountName
$Difference = (Compare-Object -ReferenceObject $a -DifferenceObject $b |`
? {$_.SideIndicator -eq "<="}).InputObject

Сравнение идентичных массивов

$a = ( Get-ADUser -f * | select -First 10 ).SamAccountName
$b = ( Get-ADUser -f * | select -First 10 ).SamAccountName
( (Compare-Object -ReferenceObject $a -DifferenceObject $b -IncludeEqual ).SideIndicator |`
%{ $_ -eq '==' } ) -notcontains $false

Добавить комментарий

Ваш адрес email не будет опубликован.