Очень полезным навыком является сравнение двух массивов.
На первый взгляд эта базовая задача в 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