【发布时间】:2021-09-19 13:05:17
【问题描述】:
有很多关于比较两个文件夹的哈希值的问题和答案,例如this one. strong>删除原件以节省空间。
将原始文件夹的哈希值(删除前)保存在文本文件中并在稍后根据该文件检查备份的完整性的最佳方法是什么。
【问题讨论】:
标签: powershell file hash compare
有很多关于比较两个文件夹的哈希值的问题和答案,例如this one. strong>删除原件以节省空间。
将原始文件夹的哈希值(删除前)保存在文本文件中并在稍后根据该文件检查备份的完整性的最佳方法是什么。
【问题讨论】:
标签: powershell file hash compare
请注意,如果您先删除原件,然后发现备份缺乏完整性,可以这么说,您只会知道出了点问题;未损坏的数据将消失。
您可以创建一个包含 2 列的 CSV 文件,RelativePath(相对于输入目录的完整文件路径)和 Hash,并将其保存到带有 Export-Csv 的 CSV 文件中:
$inputDir = 'C:\path\to\dir' # Note: specify a *full* path.
$prefixLen = $inputDir.Length + 1
Get-ChildItem -File -Recurse -LiteralPath $inputDir |
Get-FileHash |
Select-Object @{
Name='RelativePath'
Expression={ $_.Path.Substring($prefixLen) }
},
Hash |
Export-Csv originalHashes.csv -NoTypeInformation -Encoding utf8
注意:在 PowerShell (Core) 7+ 中,既不需要 -NoTypeInformation 也不需要 -Encoding utf8,但请注意该文件将具有 no UTF -8 BOM;如果需要,请使用-Encoding utf8bom;相反,在 Windows PowerShell 中,您总是得到一个 BOM。
注意:
Get-FileHash 输出的 Microsoft.PowerShell.Commands.FileHashInfo 实例还有一个 .Algorithm 属性,用于命名所使用的哈希算法(默认为 'SHA256',或通过 -Algorithm 参数指定)。
如果您希望包含此属性(所有 CSV 行的值都相同),您只需将 Algorithm 添加到上面传递给 Select-Object 的属性数组中。
注意 hashtable (@{ ... }) 如何作为第二个属性参数传递给 Select-Object 充当 calculated property,它从每个 .Path 属性值(包含 full 路径)。
您可以稍后将相同的命令应用到 backup 目录树,例如保存到 backupHashes.csv,然后将两个 CSV 文件与 Compare-Object 进行比较:
Compare-Object (Import-Csv -LiteralPath originalHashes.csv) `
(Import-Csv -LiteralPath backupHashes.csv) `
-Property RelativePath, Hash
注意:在操作中没有严格需要涉及 文件 - 一个或两个输出集合可以在内存中捕获并可以直接用于比较 - 只需省略 Export-Csv 调用上面的命令并保存到一个变量($originalHashes = Get-ChildItem ...)
【讨论】: