关于比较两个文件夹的哈希值以获得这样的完整性,有很多问题和答案。假设我有一个文件夹,我复制到备份介质(外部驱动器,闪存,光盘),并希望删除原始的为了节省空间
保存原始文件夹哈希值(在删除之前)在文本文件中最好的方法是什么,然后再根据该文件检查备份的完整性。
请注意,如果您先删除原始,然后发现备份缺乏完整性,那么可以说,您所知道的是出了问题;未损坏的数据将会消失。
您可以创建一个包含RelativePath
(相对于输入目录的完整文件路径)和Hash
两列的CSV文件,并将其保存为Export-Csv
:
$inputDir = 'C:pathtodir' # 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+中,既不需要 得到一个BOM。注意: 注意哈希表( 稍后可以将相同的命令应用于backup目录树,保存到-NoTypeInformation
也不需要-Encoding utf8
,但请注意该文件将具有没有UTF-8BOM;如果需要,使用-Encoding utf8bom
;相反,在Windows PowerShell中,总是Get-FileHash
输出的Microsoft.PowerShell.Commands.FileHashInfo
实例也有一个.Algorithm
属性,命名所使用的散列算法(默认为'SHA256'
,或通过-Algorithm
参数指定)。
如果希望包含此属性(其值对于所有CSV行都是相同的),只需将Algorithm
添加到上述传递给Select-Object
的属性数组中。@{ ... }
)作为第二个属性参数传递给Select-Object
,作为计算属性,从每个.Path
属性值(包含完整路径)派生相对路径。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 ...
)