我正在尝试使用 powershell 为整个目录生成 MD5 校验和。 在 Linux 上,有一个 1-liner 效果非常好,就像这个:
$ tar -cf - 某个目录 | md5sum
我了解到“tar”现在是 Windows10 的一部分,并且可以在 PowerShell 中对其进行寻址。 所以我尝试了这个:
tar -cf - C:\data |获取文件哈希 -MD5 算法
我从 PowerShell 得到的是这样的:
tar.exe:从成员名称中删除前导驱动器号
Get-FileHash :输入对象无法绑定到命令的任何参数,因为该命令不接受管道输入或输入及其属性与接受管道输入的任何参数不匹配
我的 Shell 设置为德语,因此我通过翻译机运行德语错误文本 (https://www.translator.eu/#)。
我想知道为什么会收到这个特定的错误消息,因为 Get-FileHash 能够处理管道输入,例如:
ls |获取文件哈希 -MD5 算法
这个命令就像一个魅力,但它为我提供了每个文件的校验和。 我想要的是完整给定目录的 1 个校验和。
所以,我可能搞砸了一些事情...... - 有什么想法吗?
编辑:这是一种即使所有文件都移动/复制到另一个位置也是一致的替代方法。这个使用所有文件的哈希来创建“主哈希”。由于显而易见的原因,运行时间更长,但会更可靠。
$HashString = (Get-ChildItem C:\Temp -Recurse | Get-FileHash -Algorithm MD5).Hash | Out-String
Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString))
原始的,更快但不太健壮的方法:
$HashString = Get-ChildItem C:\script\test\TestFolders -Recurse | Out-String
Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString))
如果需要的话可以压缩成一行,尽管它开始变得越来越难以阅读:
Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]"$(Get-ChildItem C:\script\test\TestFolders -Recurse|Out-String)"))
基本上,它使用来自
Get-ChildItem
的信息创建一个内存流,并将其传递给 Get-FileHash
。
不确定这是否是一个很好的方法,但它是唯一方法:-)
这个使用所有文件的哈希值来创建“主哈希”。由于显而易见的原因,运行时间更长,但会更可靠。
$HashString = (Get-ChildItem C:\Temp -Recurse | Get-FileHash -Algorithm MD5).Hash | Out-String Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString))
可疑的优势:移动子文件夹和文件,重命名它, 逻辑已经破坏,但哈希没有改变
原始的,更快但不太健壮的方法:
$HashString = Get-ChildItem C:\script\test\TestFolders -Recurse | Out-String Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString))
它仅适用于拉丁语,并且控制台窗口的大小取决于:)
快速解决:
$hashString = (Get-ChildItem $Path -Recurse | Out-String -Stream -Width 1024 | % { $_.TrimEnd() })
(Get-FileHash -InputStream ([IO.MemoryStream]::new([System.Text.Encoding]::ASCII.GetBytes($hashString)))).Hash
或与更可靠的组合