有很多关于比较两个文件夹的哈希完整性的问题和答案,就像这个。假设我有一个文件夹,我复制到一个备份介质(外部驱动器闪存光盘),想要删除原始的以节省空间。
什么是保存原始文件夹哈希值(在删除之前)在一个文本文件中的最好方法,也许并检查备份的完整性对该文件很久以后。
###注意,如果你删除原始的,然后发现备份缺乏完整性,所以说,所有你会知道是出了问题;未损坏的数据将消失。
您可以创建一个包含2列RelativePath(相对于输入目录的完整文件路径)和Hash的CSV文件,并使用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都不需要,但注意该文件将没有UTF-8 BOM;使用-Encoding utf8bom如果你想要一个;相反,在Windows PowerShell中,你总是会得到一个BOM。
注意:
Get-FileHash输出的Microsoft。PowerShell。Commands。FileHashInfo实例也有一个。 algorithm属性来命名所使用的哈希算法(默认为'SHA256'或通过-Algorithm参数指定)。
如果您希望包含此属性(其值将为所有CSV行相同),只需添加即可Algorithm
to the array of properties passed to Select-Object
above.
Select-Object
above.以上。
注意哈希表(@{…})作为第二个属性参数传递给Select-Object,作为一个计算过的属性,从每个。 path属性值(包含完整路径)派生出相对路径。
稍后,您可以在备份目录树中应用相同的命令,输入backuphash 。 CSV,并使用compare - object比较这两个CSV文件:
Compare-Object (Import-Csv -LiteralPath originalHashes.csv) `
(Import-Csv -LiteralPath backupHashes.csv) `
-Property RelativePath, Hash
注意:没有严格的操作需要涉及文件——一个或两个输出集合可以被捕获在内存中,可以直接使用在比较——就省略Export-Csv调用上面的命令,保存到一个变量($ originalHashes = Get-ChildItem…)