powershelldirectorymd5checksum

MD5-Checksum hashing with powershell for a whole directory


I'm trying to generate an MD5-Checksum with powershell for a whole directory. On Linux there is a 1-liner that works just great, like this one:

$ tar -cf - somedir | md5sum

I learned that "tar" is now part of Windows10 and that it can be adressed in the PowerShell. So I tried this:

tar -cf - C:\data | Get-FileHash -Algorithm MD5

What I get from PowerShell is this:


tar.exe: Removing leading drive letter from member names
Get-FileHash : the input object cannot be bound to any parameters of the command because the command does not accept pipeline input or the input and its properties do not match any of the parameters that accept pipeline Input


My Shell is set to german, so I ran the german error text through a Translation machine (https://www.translator.eu/#).

I wondered why I get this particular error message, because Get-FileHash IS able to process pipelined Input, e.g.:

ls | Get-FileHash -Algorithm MD5

This command just works like a charm, but it gives me checksums for each and every file. What I want is 1 checksum for a complete given directory.

So, I probably messed up something… - any ideas?


Solution

  • EDIT: Here's an alternate method that is consistent even if all the files are moved/copied to another location. This one uses the hashes of all files to create a "master hash". It takes longer to run for obvious reasons but will be more reliable.

    $HashString = (Get-ChildItem C:\Temp -Recurse | Get-FileHash -Algorithm MD5).Hash | Out-String
    Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString))
    

    Original, faster but less robust, method:

    $HashString = Get-ChildItem C:\script\test\TestFolders -Recurse | Out-String
    Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString))
    

    could be condensed into one line if wanted, although it starts getting harder to read:

    Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]"$(Get-ChildItem C:\script\test\TestFolders -Recurse|Out-String)"))
    

    Basically it creates a memory stream with the information from Get-ChildItem and passes that to Get-FileHash.

    Not sure if this is a great way of doing it, but it's one way :-)