2015-11-06 61 views
2

我正在寻找一种可靠的命令行方法来获取Windows中文件的SHA256哈希值。我的理解是,通过PowerShell下的Microsoft的Get-FileHash cmdlet来实现这一点。我看过几个带有示例的网站,并查看了微软自己的文档。看来,下面的语法要在Windows Server 2012上运行:无法从get-filehash获取输出

Get-FileHash myfile.txt -Algorithm SHA256 

命令运行没有错误,但没有输出。如果我将输出发送到一个文件,则创建文件时不包含任何内容。我也看到了将输出传递给Format-List的例子;我尝试过,但仍然没有。我也曾尝试用无效参数运行该命令,并且什么也没有。

我愿意使用不同的程序,但由于业务需求,它需要支持下载。

+0

尝试:Get-FileHash。\ myfile.txt -Algorithm SHA256并失败:$ hash = Get-FileHash。\ myfile.txt - 算法SHA256。 –

+0

关于第一个建议,我试过了,但是我提供的论点并不重要。第二,操作系统接受语法,但是当我输出$ hash时,那里什么也没有。 –

+0

什么是您的$ PSVersionTable.PSVersion值? –

回答

1

Get-FileHash,需要的Windows PowerShell 4.0 根据您的意见,你是在3版本,这是默认的2012年运(非R2)Here how to check you PS version

您可以在Win 2012(非R2)来更新PS版本4.0或用Win 2012 R2

如果你只是运行GET-FileHash一个PS版3系统上你应该得到

PS C:\> Get-FileHash 
Get-FileHash : The term 'Get-FileHash' is not recognized as the name of a cmdlet, function, script file, or operable 
program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 
At line:1 char:1 
+ Get-FileHash 
+ ~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (Get-FileHash:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

较低的PS版,您可以使用此功能

Function Get-FileHashTSO([String] $FileName,$HashName = "SHA1") 
{ 
$FileStream = New-Object System.IO.FileStream($FileName,[System.IO.FileMode]::Open) 
$StringBuilder = New-Object System.Text.StringBuilder 
[System.Security.Cryptography.HashAlgorithm]::Create($HashName).ComputeHash($FileStream)|%{[Void]$StringBuilder.Append($_.ToString("x2"))} 
$FileStream.Close() 
$StringBuilder.ToString() 
} 

店作为.PS(例如GET-FileHashTSO.ps1)文件,并调用它像这样

powershell -command "& { . C:\myScripts\Get-FileHashTSO.ps1 ; Get-FileHashTSO "C:\someLocation\someFile.iso" "SHA1" }" 
2

我使用的PowerShell 4.0,我正好遇到空输出同样的问题,从GET-FileHash。我的问题的原因是不同于OP,但我找到了解决我的问题,我想我会发布我的发现,谁来到这个页面试图解决空输出(或看似不正确的输出)从Get -FileHash。

只有当目标文件的路径包含方括号[]时,问题才会发生(对于我),并且这些方括号包含零个字符或2个或更多个字符。

编辑:我现在明白为什么会发生这种情况。该字符串被解释为正则表达式(RegEx),所以方括号[]具有其特殊的RegEx含义。 -LiteralPath通知PowerShell将该字符串解释为简单匹配(无RegEx)。

考虑其指4个现有文本文件(假设)以下路径:

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

以下命令产生正常输出:

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

但会有零输出,如果使用以下命令:

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

这可以通过使用 - LiteralPath开关。例如:

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

当使用-LiteralPath开关时,变量正常扩展。例如:

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

如果方括号之间只有一个字符,则在使用Get-FileHash时,方括号将被忽略。

考虑下面的路径,其是指3个现有的文本文件(假设),每个都有唯一的哈希值:

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

GET-FileHash解释所有三个完全相同的方式下列命令(路径被解释为C:\测试\我TEXT.TXT),因此每个命令具有尽管每个文件有它自己独特的散列值完全相同的输出:

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

PS我是一个非常新的程序员,请原谅我对术语的不当使用。