Заметки · 23.03.2023

Сравнение файлов в PowerShell

Во время синхронизации содержимого папок возникла необходимость проверки изменённых файлов, чтобы случайно не заменить новую версию файла старой. Решено было обратиться к вычислению и сравнению контрольных сумм файлов с помощью командлета Get-FileHash. В качестве примера я взял алгоритм MD5.

Получилась вот такая функция:

function СompareFileHash ($file1, $file2)
{
    $TestFile1 = Test-Path $file1 -PathType Leaf
    $TestFile2 = Test-Path $file2 -PathType Leaf
    if ($TestFile1 -and $TestFile2)  
    {
      try {
            $hash1 = (Get-FileHash $file1 -Algorithm "MD5").Hash
            $hash2 = (Get-FileHash $file2 -Algorithm "MD5").Hash
            if ($hash1 -eq $hash2) { return $true }
            else { return $false }
          }
      catch { return $false }
    }
    else { $fileserr = "Ошибка доступа к файлам"; return $fileserr }
 }

Функция проверяет наличие файлов, получает hash и сравнивает. Если контрольные суммы одинаковые — файлы идентичны. Если конкретный файл или все файлы не найдены — будет выведена ошибка из переменной $fileserr.

Вызвать функцию в коде скрипта можно так:

СompareFileHash -file1 "\\path\to\file1" -file2 "\\path\to\file2"

А вот так можно вызвать функцию в операторе сравнения:

if (СompareFileHash -file1 "\\path\to\file1" -file2 "\\path\to\file2" -eq True)
{ Write-Host "Файлы совпадают. Всё хорошо." -ForegroundColor Green }
else { Write-Host "Файлы разные." -ForegroundColor Red }

Обращаю Ваше внимание, что скорость работы командлета Get-FileHash зависит от размера файла. Чем больше файл — тем дольше будет вычисляться контрольная сумма.