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.
Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]
Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.