Рубрики
Uncategorized

Рекурсивное сравнение папок с PowerShell

Проблема, этот пост определенно не «новый» или революционный, но я был очень удивлен … Tagged с DevOps, PowerShell.

Проблема

Этот пост определенно не «новый» или революционер, но я был очень удивлен, обнаружив, как в 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»