【问题标题】:MD5-Checksum hashing with powershell for a whole directory使用 powershell 对整个目录进行 MD5-Checksum 散列
【发布时间】:2021-02-04 14:17:55
【问题描述】:

我正在尝试使用 powershell 为整个目录生成 MD5 校验和。 在 Linux 上,有一个 1-liner 非常好用,就像这个:

$ tar -cf - somedir | md5sum

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

tar -cf - C:\data | Get-FileHash - 算法 MD5

我从 PowerShell 中得到的是:


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


我的 Shell 设置为德语,因此我通过翻译机 (https://www.translator.eu/#) 运行了德语错误文本。

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

ls | Get-FileHash - 算法 MD5

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

所以,我可能搞砸了…… - 有什么想法吗?

【问题讨论】:

  • PowerShell 是基于对象的,运行诸如 tar.exe 之类的随机命令行程序不会只返回字符串对象,这些对象的管道通常不会给您想要的结果。 ls 管道的原因是它只是 PowerShell cmdlet Get-Childitem 的别名。用例是什么,检查文件夹中是否发生了变化?
  • Get-FileHash 通过管道接受文件信息引用,而不是原始输入数据。 tar -cf "$env:temp\data.tar" C:\data; Get-FileHash "$env:temp\data.tar" -Algorithm MD5; Remove-Item "$env:temp\data.tar" -Force 应该这样做
  • @MathiasR.Jessen;你的建议就像一个魅力,而且非常快!非常感谢。如何将您的评论标记为出色的解决方案? :-)

标签: powershell directory md5 checksum


【解决方案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

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

【讨论】:

  • 这个 1-liner 可以工作 - 如果仅仅获得目录列表的校验和就足够了,但如果在目录的 1 个文件中,这个哈希很可能是相同的1 个字符会与另一个字符交换,对吗?
  • OK - 刚刚再次检查,它确实“看到”了一个交换的字符...... - 由于交换了 1 个字符(或任何字符),更改的文件得到一个新的时间戳,因此另一个哈希......到目前为止,一切都很好...... - 但是这个哈希方法是否也会“看到”目录是否会被复制到另一个位置,而目录中的 1 个文件会被复制并出现错误(复制错误)?
  • @LightningJack ...但这也意味着您不能信任它 - 如果两组文件的内容相同,它将根据不同的日期产生不同的哈希
  • @MathiasR.Jessen...你是对的,在这种情况下这种方法会有缺陷。但是,如果有人想确保绝对没有对整个目录中的任何文件进行任何更改,那么这种方法对我来说似乎是可行的 - 所以我也会将此答案标记为特定场景的可能解决方案。
  • @LightningJack 使用类似的方法很容易,但我们使用所有文件的哈希值作为基础,而不是使用 Get-ChildItem。这将花费稍长的时间,但如果性能不重要,这很容易。我将在今天晚些时候使用该选项更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2019-05-08
  • 2014-03-28
  • 2015-10-25
  • 1970-01-01
相关资源
最近更新 更多