Fájlok egyszerű azonosításához érdemes lehet az ő kivonatukat előállítani. Ez a kivonat egy szám, ami kellően nagy ahhoz, hogy kis esélye legyen annak, hogy két különböző fájlnak is éppen egyforma legyen a kivonata, de kellően kicsi ahhoz, hogy egyszerűen, „helytakarékosan” tároljuk ezeket az azonosítókat.
A következő szkript Lee Holmes PowerShell Cookbook könyvéből származik ( http://poshcode.org/2154 ), a fájlt a futószalagon várja és választható, hogy milyen kivonatot kérünk egy fájlhoz:
param(
[ValidateSet("MD5", "SHA1", "SHA256", "SHA384", "SHA512")]
$HashAlgorithm = "MD5"
)
process {
if(!$_.psiscontainer){
## Create
the hash object that calculates the hash of our file.
$hashType = [Type] "System.Security.Cryptography.$HashAlgorithm"
$hasher = $hashType::Create()
$inputStream = New-Object IO.StreamReader $_.fullname
$hashBytes = $hasher.ComputeHash($inputStream.BaseStream)
$inputStream.Close()
## Convert
the result to hexadecimal
$builder = New-Object System.Text.StringBuilder
$hashBytes | Foreach-Object { [void] $builder.Append($_.ToString("X2")) }
## Return
a custom object with the important details from the hashing
$output = New-Object PsObject -Property @{
Path = $_.fullname;
HashAlgorithm = $hashAlgorithm;
HashValue = $builder.ToString();
Size = $_.length
}
$output
}
}
Nézzük ennek működését:
[23] PS C:\> dir c:\ee\d* | C:\_munka\filehash.ps1 | ft path, hashvalue
Path HashValue
---- ---------
C:\ee\dat03 - Copy.csv CBB3578F8223955A11558FE4F0599CC7
C:\ee\dat03.csv CBB3578F8223955A11558FE4F0599CC7
Látható, hogy rázúdítva erre a FileHash.ps1 szkriptre a fájljaimat ez kiadja – többek között – a fájl elérési útját és a kiszámított kivonat értékét. Látható, hogy annak ellenére, hogy a két fájlnak más a neve, a kivonat – mivel az csak a fájl tartama alapján készült – egyforma. Nézzük, mi lesz a kivonatok értéke, ha egy karakter írok csak át az egyik fájlban:
[24] PS C:\> dir c:\ee\d* | C:\_munka\filehash.ps1 | ft path, hashvalue
Path HashValue
---- ---------
C:\ee\dat03 - Copy.csv CD982847FF6212858624FB385947F30B
C:\ee\dat03.csv CBB3578F8223955A11558FE4F0599CC7
Látható, hogy a másolati fájlnak nagyon megváltozott a kivonatértéke.
PowerShell 5.0-ba már bekerült natívan ez a funkció a Get-FileHash cmdlettel:
PS C:\> Get-FileHash -Path C:\Downloads\BiosUpdate.exe | fl
Algorithm : SHA256
Hash : E9ED64C39C2DA440AE7950DB6EF35F7804C1D84CAFB7694BF74004C7C56C368D
Path : C:\Downloads\BiosUpdate.exe
Megválaszthatjuk a hashalgoritmust és a futószalagról is betölthetjük a fájlokat:
PS C:\> dir C:\Downloads\*.exe | Get-FileHash -Algorithm MD5
Algorithm Hash
--------- ----
MD5 50F1AE22F540CE3737D0C31EF0CF7144
MD5 DC7D985E03B8F315EBE88A4A89818FFE
MD5 27033DD8BF332B2037253F91D87205A6
MD5 9D4CFD9EA30DA6CA3507FB72CDD029C4