2015-11-06 88 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我是一個非常新的程序員,請原諒我對術語的不當使用。