使用 powershell 对整个目录进行 MD5 校验和散列

MD5-Checksum hashing with powershell for a whole directory

我正在尝试使用 powershell 为整个目录生成 MD5 校验和。 在 Linux 上有一个 1-liner 效果很好,比如这个:

$ tar -cf - somedir | md5sum

我了解到“tar”现在是 Windows10 的一部分,并且可以在 PowerShell 中对其进行寻址。 所以我尝试了这个:

tar -cf - C:\data |获取文件哈希算法 MD5

我从 PowerShell 得到的是这样的:


tar.exe: 删除成员名称中的前导驱动器号
Get-FileHash : 输入对象不能绑定到命令的任何参数,因为命令不接受管道输入或输入及其属性与接受管道输入的任何参数都不匹配


我的 Shell 设置为德语,所以我 运行 通过 T运行slation 机器 (https://www.translator.eu/#) 的德语错误文本。

我想知道为什么我会收到这条特定的错误消息,因为 Get-FileHash 能够处理管道输入,例如:

ls |获取文件哈希算法 MD5

这个命令就像一个魅力,但它为我提供了每个文件的校验和。 我想要的是完整给定目录的 1 个校验和。

所以,我可能搞砸了一些事情...... - 有什么想法吗?

编辑:这是一种替代方法,即使所有文件都moved/copied到另一个位置也是一致的。这个使用所有文件的散列来创建“主散列”。由于显而易见的原因,运行 需要更长的时间,但会更可靠。

$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

不确定这是否是一个很好的方法,但这是 一种 方式:-)