我正在寻找一种可靠的命令行方法来获取 Windows 中文件的 SHA256 哈希值。我的理解是,这样做的方法是在 PowerShell 下通过 Microsoft 的 Get-FileHash cmdlet。我看过几个带有示例的网站,并查看了 Microsoft 自己的文档。以下语法似乎适用于 Windows Server 2012:
Get-FileHash myfile.txt -Algorithm SHA256
Run Code Online (Sandbox Code Playgroud)
命令运行没有错误,但没有输出。如果我将输出发送到文件,则创建的文件没有内容。我还看到了将输出通过管道传输到 Format-List 的示例;我试过了,但仍然没有。我也试过用无效参数运行命令,但又没有。
我愿意使用不同的程序,但由于业务需求,它需要是受支持的下载。
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
以下命令产生正常输出:
Get-FileHash "C:\Test\My Text.txt"
Run Code Online (Sandbox Code Playgroud)
但是如果使用以下命令会有空输出:
Get-FileHash "C:\Test\My [Text].txt"
Get-FileHash "C:\Test\My [Te]xt.txt"
Get-FileHash "C:\Test\My Text[].txt"
Run Code Online (Sandbox Code Playgroud)
这可以通过使用 -LiteralPath 开关来解决。例如:
Get-FileHash -LiteralPath "C:\Test\My [Text].txt"
Run Code Online (Sandbox Code Playgroud)
使用 -LiteralPath 开关时,通常会扩展变量。例如:
(Get-ChildItem C:\Test).FullName | ForEach {
Get-FileHash -LiteralPath $_
}
Run Code Online (Sandbox Code Playgroud)
如果括号之间正好有 1 个字符,则使用 Get-FileHash 时将忽略括号。
考虑以下引用 3 个现有文本文件(假设)的路径,每个文件都有唯一的哈希值:
C:\Test\My Text.txt
C:\Test\My Tex[t].txt
C:\Test\My[ ]Text.txt
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
PS我是一个非常新的程序员,请原谅我对术语的任何不良使用。
归档时间: |
|
查看次数: |
18760 次 |
最近记录: |