Проблема
Этот пост определенно не «новый» или революционер, но я был очень удивлен, обнаружив, как в PS Compare-Object Holper, и я обязательно забыл в будущем…
В рамках некоторой недавней работы по дорожной карте мы перешли к новой технологии установщика для некоторых из наших инструментов. Это произошло с некоторыми незначительными головными болями, такими как проверка, мы собрали все правильные файлы. Первой итерацией этого была ручная проверка, которая, очевидно, подвержена человеческой ошибке — помимо того, что он ошеломлял!
Я действительно не хотел использовать сторонний инструмент. Winmerge Могу провести фантастические сравнения, но я хотел что -то быстро и индивидуально. В идеале также не тратить дольше 10 минут, создавая какой -либо код!
Первая итерация состояла в том, чтобы сделать рекурсивный цикл, выявить все имена файлов (примечание: не путь) в 2 отдельных текстовых файла. Единственной «нитикой» был я обернутый имена каталогов в квадратных скобках, чтобы дать ему некоторые организация
Недостатком этого является то, что он действительно работал только для моей папки с примерами с несколькими элементами. В производстве с тысячами файлов и вложенных папок это был простой хаос. Кроме того, мне пришлось сравнить эти файлы в стороннем инструменте, как Winmerge, все равно, убирая это!
Окончательная версия моего сценария была направлена только на то, чтобы показать разницу (избегайте шума), в идеале показать, в каком направлении произошло изменение с использованием Сравните-объект в PowerShell.
Результат
- Сделайте рекурсивный цикл через структуру каталога
- Выходные папки имена как [папка] и рекурсивно погрузитесь. Это немного грязно, так как я не хотел, чтобы полный путь (труднее сравнить), но хотел дифференцировать, когда я выкопал. YMMV.
- Выходные имена файлов, за исключением некоторых файлов, которые мне было все равно (например, файлы .tmp & .xml)
- Сделайте это для папки A и папки B, сохраняя результат к переменной
- Использование сравнения-объекта на этих переменных и вывода результата.
function GetFiles($path, [string[]]$excludedFiles) { foreach ($item in Get-ChildItem $path) { if ($excludedFiles | Where {$item -like $_}) { continue } if( (Get-Item $item.FullName) -is [System.IO.DirectoryInfo]){ $('['+$item.Name+']') }else{ $($item.Name) } if (Test-Path $item.FullName -PathType Container) { GetFiles $item.FullName $excludedFiles } } } $env1 = GetFiles -path "C:\folderA\" -excludedFiles "*.xml",".tmp" $env2 = GetFiles -path "C:\folderB\" -excludedFiles "*.xml",".tmp" Compare-Object -DifferenceObject $env1 -ReferenceObject $env2
Который обеспечивает выходные данные, подобные:
Это определенно может быть оптимизировано и очищено наверняка, и YMMV массово.
В целом, несколько минут в PowerShell и мне удалось сэкономить существенное время — и это была моя единственная реальная цель!
Пост Рекурсивное сравнение папок с PowerShell появился первым на yer.ac | Приключения разработчика и другие вещи. .
Оригинал: «https://dev.to/yerac/recursive-folder-comparison-with-powershell-1dfi»