Как сравнить массивы один за другим с powershell - PullRequest
2 голосов
/ 21 февраля 2020

Как сравнить массивы один за другим с powershell.

Я пробовал с помощью eq / match / like / contains / in. Но все еще не работает нормально. Большое спасибо.

вход 【массив】:

$ массив = @ («ОК», «ОК», «ОК», «ОК»)

$ массив1 = @ (' OK ',' fail ',' OK ',' OK ')

$ array2 = @ ("OK")

Ожидаемый результат:

$ Array сравнить выход Array2 Ture

$ Array1 сравнить выход Array2 False

Ответы [ 3 ]

4 голосов
/ 21 февраля 2020

Если порядок элементов (а не только значений) двух массивов имеет значение (т.е. оба массива должны иметь одинаковое количество элементов, значения элементов должны быть одинаковыми И порядок, в котором элементы должны отображаться одинаково), вы можете использовать

@(Compare-Object $array1 $array2 -SyncWindow 0).Length -eq 0

Если порядок, в котором элементы появляются в массивах, не имеет значения:

@(Compare-Object $array1 $array2).Length -eq 0

Редактировать

Учитывая ваш комментарий "если все значения в массиве в порядке, то вывести true, если одно из них не в порядке, то вывести false" , вы можете просто сделайте:

$array = 'OK','OK','OK','OK'
# test if all elements are 'OK'
($array | Where-Object { $_ -ne 'OK' }).Count -eq 0  # outputs True

Если один из элементов не «в порядке», как, например, с $array1

$array1 = 'OK','failed','OK','OK'
# test if all elements are 'OK'
($array1 | Where-Object { $_ -ne 'OK' }).Count -eq 0  # outputs False

Здесь «хитрость» заключается в том, что отдельные элементы массива в предложении Where-Object. Это служит фильтром и пропускает все элементы, которые не в порядке. Наконец, мы просто используем свойство Count результирующего массива и, если там ничего нет, счетчик будет равен 0, что означает True

1 голос
/ 21 февраля 2020

Похоже, что Group-Object сделает это проще.

@($array+$array2 | Group-Object).Count -eq 1
True
@($array1+$array2 | Group-Object).Count -eq 1
False

Если все входные массивы содержат одинаковые значения элементов, то он вернет True.

Причина синтаксис @() - всегда создавать массив со свойством Count. Это переопределит свойство Count, конфликтующее с Group-Object в случаях, когда возвращаются отдельные объекты. Если Group-Object находит только один вариант (в результате получается один объект), тогда выходным объектом будет объект Microsoft.PowerShell.Commands.GroupInfo со своим собственным свойством Count. Когда возвращается несколько объектов, типом объекта является System.Object[], который имеет искомое свойство Count.


В качестве альтернативы, mklement0 упоминается с использованием автомата c свойство Length, которое дает несколько более краткое решение. Это решение более неясно, учитывая скрытую природу свойства Length.

($array+$array2 | Group-Object).Length -eq 1
($array1+$array2 | Group-Object).Length -eq 1
0 голосов
/ 21 февраля 2020

Исходя из ожидаемого результата, я полагаю, что вы пытаетесь определить, все ли элементы исходного массива ($array and $array1 в вашем случае) равны значению в тестовом массиве ($array2 в вашем случае). Я думаю, что у меня есть похожий вариант использования при перемещении каталогов данных по моей сети. Мой сценарий перемещения создает файл CSV в виде файла журнала и содержит столбец «Успех», в котором указывается, была ли каждая копия файла успешной или нет. У меня есть подпрограмма, которая принимает один из этих файлов журнала в качестве входных данных и обрабатывает столбец «Успех» как массив значений «Истина / Ложь». Чтобы проверить, является ли вся копия действительной, я должен определить, что все элементы «Success» для каждого отдельного файла являются «True», и свести это в единое «True / False» для всей копии.

Если это так, вы должны сделать следующее:

$good = $true
$sourcearray | % {$good = $good -and ($_ -eq $testarray[0])}

Если все элементы $sourcearray равны $testarray[0], тогда $good останется $true. Итак:

$array = @('OK','OK','OK','OK')
$array1 = @('OK','failed','OK','OK')
$array2 = @("OK")

$arraygood = $true
$array | % {$arraygood = $arraygood -and ($_ -eq $array2[0])}

$array1good = $true
$array1 | % {$array1good = $array1good -and ($_ -eq $array2[0])}

"`$arraygood = $arraygood"
"`$array1good = $array1good"

Запуск приведенного выше кода дает мне результаты:

$arraygood = True
$array1good = False

Надеюсь, это поможет. Если это так, пожалуйста, не забудьте принять ответ с галочкой в ​​правом верхнем углу. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...