Haszujemy pliki w PowerShell

krótki URL: /4lj

kategorie:Inne Pchełki, Pchełki
tagi:hash, pchełki, powershell

Jakiś czas temu opowiadałem o funkcji skrótu. Dziś króciutko pokażę jak w PowerShell-u zaimplementować haszowanie plików.

Idea jest taka, żeby dla każdego pliku danego typu w pewnym folderze utworzyć - w tym samym folderze - plik z haszem, o identycznej nazwie, tylko z dołączonym rozszerzeniem ".hash"

Po co takie cyrki, pytacie?

A no na przykład po to, żeby ktoś, kto kopiuje taki plik od nas, mógł go sobie zweryfikować po swojej stronie (czyli porównać hasz, który sam sobie wygeneruje, z haszem, który dostanie od nas).

Albo po to, żeby wyłapać pliki o różnych nazwach, ale identycznych zawartościach (będą miały takie same hasze).

Kod jest prościutki, ale może komuś się akurat przyda:

$strPath = "C:\jakis\fajny\folder\"
$strMask = "*.xml"
$blnRecurse = 1

if($blnRecurse -eq 0) {
    $colAllFiles = Get-ChildItem -Path $strPath -Include $strMask
} else {
    $colAllFiles = Get-ChildItem -Path $strPath -Recurse -Include $strMask
}

$colAllFiles |
ForEach-Object {
    $strHashFileName = $($_.FullName + ".hash")
    $blnDoHashFile = 1
    if (Test-Path $strHashFileName) {
        $dtFileDate = $_.lastwritetime
        $dtHashDate = $(Get-Item $strHashFileName).lastwritetime
        if($dtFileDate -gt $dtHashDate) {
            Remove-Item $strHashFileName
        } else {
            $blnDoHashFile = 0
        }
    }
    if($blnDoHashFile -eq 1) {
        $strHash = (Get-FileHash($_.FullName)).Hash
        $strHash > $strHashFileName
    }
}

Ponieważ jestem leniwy, nie będę omawiał całego kodu. Podpowiem tylko, że samo haszowanie odbywa się pod koniec skryptu (Get-FileHash), a także, że skrypt nie marnuje czasu na haszowanie pliku już pohaszowanego, o ile tylko plik z haszem został utworzony później, niż plik haszowany (w przeciwnym przypadku skrypt skasuje stary hasz i utworzy nowy). Można również ustawić parametr $blnRecurse na jeden lub zero (włączenie - wyłącznie haszowania w podkatalogach).

Pytania, wnioski bądź petycje zwyczajowo już proszę kierować na Berdyczów do sekcji komentarzy.

Komentarze