【问题标题】:Unable to get output from get-filehash无法从 get-filehash 获取输出
【发布时间】:2015-11-06 17:37:04
【问题描述】:

我正在寻找一种可靠的命令行方法来获取 Windows 中文件的 SHA256 哈希值。我的理解是,执行此操作的方法是通过 Microsoft 在 PowerShell 下的 Get-FileHash cmdlet。我看过几个带有示例的网站并查看了 Microsoft 自己的文档。看来以下语法应该适用于 Windows Server 2012:

Get-FileHash myfile.txt -Algorithm SHA256

命令运行没有错误,但没有输出。如果我将输出发送到文件,则会创建没有内容的文件。我还看到了将输出传输到 Format-List 的示例;我试过了,但仍然没有。我也尝试过使用无效参数运行命令,但又没有。

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

【问题讨论】:

  • 尝试:Get-FileHash .\myfile.txt -Algorithm SHA256 失败:$hash=Get-FileHash .\myfile.txt -Algorithm SHA256。
  • 关于第一个建议,我试过了,但我提供什么参数并不重要。第二个,操作系统接受语法,但是当我输出 $hash 时,那里什么都没有。
  • 你的 $PSVersionTable.PSVersion 值是多少?
  • Major=3,Minor=0,Build=-1 Revision=-1
  • 你有其他同平台的电脑可以交叉测试吗?

标签: powershell sha256


【解决方案1】:

我正在使用 PowerShell 4.0,我刚刚遇到了来自 Get-FileHash 的空输出的相同问题。我的问题的原因与 OP 不同,但我找到了解决问题的方法,我想我会将我的发现发布给任何来到此页面试图解决 Get 的空输出(或看似不正确的输出)问题的人-文件哈希。

仅当目标文件的路径包含方括号 [ ] 并且这些方括号包含零个字符或 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 $_
}

如果括号之间正好有 1 个字符,则使用 Get-FileHash 时括号将被忽略。

考虑以下引用 3 个现有文本文件(假设)的路径,每个文件都有唯一的哈希值:

C:\Test\My Text.txt
C:\Test\My Tex[t].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 Tex[t].txt"
Get-FileHash "C:\Test\My[ ]Text.txt"

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

【讨论】:

  • 很好的指针,但请注意,使用(隐含的)-Path 参数,参数被解释为wildcard expressions,而不是正则表达式。
【解决方案2】:

Get-FileHash,需要 Windows PowerShell 4.0 根据您的 cmets,您处于第 3 版,这是 Win 2012(非 R2)Here how to check you PS version987654322@

的默认设置

您可以将 Win 2012(非 R2)上的 PS 更新到 4.0 版或使用 Win 2012 R2

如果你只是在 PS 版本 3 系统上运行 Get-FileHash 你应该得到

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" }"

【讨论】:

    【解决方案3】:

    我计算了驱动器上所有文件的哈希值,并使用以下方法将它们导出为 .csv:

    Get-ChildItem C: -Recurse |
        Get-FileHash |
        Export-Csv -Path C:\Users\yourname\Documents\Output\hashes.csv -NoTypeInformation
        Import-Csv -Path C:\Users\yourname\Documents\Output\hashes.csv
    

    为什么有效(我认为):

    Get-ChildItem

    Get-FileHash

    Export-Csv

    Import-Csv

    在运行脚本之前,请务必在该位置创建 .csv 文件。该脚本不会为您创建容器。运行之间无需清除 .csv 文件中的数据,它会自行清除。

    我不是一个真正的程序员,因此解释得非常冗长。希望它可以帮助别人。如果没有 Stack Overflow 论坛,就不会明白这一点!谢谢大家!!

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2021-02-12
      相关资源
      最近更新 更多