Переписать сравнение файла powershell без циклов или операторов if - PullRequest
0 голосов
/ 27 июня 2018

Как лучше всего переписать следующий код PowerShell, который сравнивает список из двух файлов, гарантируя, что они имеют одинаковое (или большее) количество файлов, и что второй список содержит каждый файл в первом списке:

$noNewFiles = $NewFiles.Count -ge $OldFiles.Count
foreach ($oldFile in $OldFiles){
    if (!$NewFiles.Contains($oldFile)) {
        return $false
    }
}   

1 Ответ

0 голосов
/ 27 июня 2018

PSv3 + синтаксис (? - это встроенный псевдоним для Where-Object командлета):

(Compare-Object $NewFiles $OldFiles | ? SideIndicator -eq '=>').Count -eq 0

Более эффективная альтернатива PSv4 + с использованием метода Where() (как предложил сам Брайан (ОП)):

(Compare-Object $NewFiles $OldFiles).Where-Object({ $_.SideIndicator -eq '=>' }).Count -eq 0

По умолчанию Compare-Object возвращает только различия между двумя наборами и объектами вывода, свойство которых .SideIndicator указывает набор, для которого элемент уникален:

Поскольку строковое значение => указывает на элемент, который является уникальным для 2-го набора (RHS), мы можем отфильтровать различия до элементов, уникальных для 2-го набора, поэтому, если их число равно 0, подразумевается, что есть нет элементов уникальных для 2-го набора.

Примечание:
Как определяется «сходство» (равенство), зависит от типа данных элементов.
Подводный камень в том, что экземпляры ссылочных типов сравниваются по их значениям .ToString(), что может привести к тому, что разнородные объекты будут считаться равными. Например, Compare-Object @{ one=1 } @{ two=2 } производит no output.

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