Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to get output from get-filehash

I am looking for a reliable command-line method of getting SHA256 hashes for files in Windows. My understanding is that the way to do this is via Microsoft's Get-FileHash cmdlet under PowerShell. I have seen several web sites with examples and reviewed Microsoft's own documentation. It appears that the following syntax should work on Windows Server 2012:

Get-FileHash myfile.txt -Algorithm SHA256

The command runs without error, but there is no output. If I send the output to a file, the file is created with no content. I have also seen examples which pipe the output to Format-List; I tried that, but still nothing. I have also tried running the command with invalid arguments, and again nothing.

I am open to using a different program, but due to business requirements, it would need to be a supported download.

like image 882
Alan Frank Avatar asked Sep 15 '25 14:09

Alan Frank


1 Answers

I'm using PowerShell 4.0 and I just encountered the same problem of null output from Get-FileHash. The cause of my problem is different than the OP but I have found a solution to my problem and I figured I would post my findings for anyone who came to this page trying to solve the problem of null output (or seemingly incorrect output) from Get-FileHash.

The problem only happens (for me) when the path to the target file contains brackets [ ] and those brackets contain either zero characters or 2 or more characters.

EDIT: I now understand WHY this happens. The string is interpreted as Regular Expression (RegEx) so the square brackets [ ] take on their special RegEx meaning. The -LiteralPath tells PowerShell to interpret the string as a simple match (no RegEx).

Consider the following paths which refer to 4 existing text files (hypothetically):

C:\Test\My Text.txt
C:\Test\My [Text].txt
C:\Test\My [Te]xt.txt
C:\Test\My Text[].txt

The following command produces normal output:

Get-FileHash "C:\Test\My Text.txt"

but there will be null output if using the following commands:

Get-FileHash "C:\Test\My [Text].txt"
Get-FileHash "C:\Test\My [Te]xt.txt"
Get-FileHash "C:\Test\My Text[].txt"

This can be solved by using the -LiteralPath switch. For example:

Get-FileHash -LiteralPath "C:\Test\My [Text].txt"

Variables are expanded normally when using the -LiteralPath switch. For example:

(Get-ChildItem C:\Test).FullName | ForEach {
Get-FileHash -LiteralPath $_
}

If there is exactly 1 character between the brackets, the brackets will be ignored when using Get-FileHash.

Consider the following paths which refer to 3 existing text files (hypothetically), each with unique hash values:

C:\Test\My Text.txt
C:\Test\My Tex[t].txt
C:\Test\My[ ]Text.txt

Get-FileHash interprets all three of the following commands in exactly the same way ( the path is interpreted as C:\Test\My Text.txt ) and therefore each command has the exact same output despite each file having it's own unique hash value:

Get-FileHash "C:\Test\My Text.txt"
Get-FileHash "C:\Test\My Tex[t].txt"
Get-FileHash "C:\Test\My[ ]Text.txt"

P.S. I'm a very new programmer, please forgive me for any poor usage of terminology.

like image 75
Zelda64 Avatar answered Sep 17 '25 07:09

Zelda64