我正在使用PowerShell 4.0,刚遇到了与Get-FileHash返回null输出的相同问题。我的问题的原因与OP不同,但我已经找到了解决方法,并且认为我应该发布我的发现,以供任何试图解决Get-FileHash返回null输出(或看似不正确的输出)问题的人参考。
只有当目标文件的路径包含方括号[]并且这些方括号包含零个字符或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:\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"
PS:我是一位非常新的程序员,请原谅我使用术语不当的地方。