比较Powershell中两个不同目录的MD5哈希值

Comparing MD5 hashes of two different directories in Powershell

我对 Powershell 很陌生,所以请原谅我缺乏经验或缺乏最佳实践。 我正在编写一个脚本,它将首先以 CSV 格式存储两个不同目录的 MD5 哈希值。然后我想比较这两个文件,如果两个 CSV 文件有任何变化(即文件的 MD5 哈希值不匹配或源文件夹的 CSV 文件中的一个文件在目标文件夹的 CSV 文件中不存在),我想生成一个包含不匹配或缺失文件详细信息的新列表。

除此之外,我想知道是否有更快的方法来比较这两个文件,因为我正在处理的文件夹非常大,里面有大约 12k 个文件。我在想,也许我会尝试保持源 CSV 完好无损,并在检查和验证时从目标 CSV 中逐一删除条目。谁能帮我解决这个问题?

#Getting the MD5 hash of the Installer and storing it a csv format
$SourcePath = Get-ChildItem -Path C:\source -Recurse
$SourcerHash = foreach ($File in $SourcePath) 
{
    Get-FileHash $File.FullName -Algorithm MD5
}
$SourceHash | Export-Csv -Path C:\Users\abcd\Desktop\CSVExports\SourceHash.csv

#Getting the MD5 hash of the destination directory and storing it in a csv format
$DestinationPath = Get-ChildItem -Path C:\destination -Recurse
$DestinationHash = foreach ($File in $DestinationPath) 
{
    Get-FileHash $File.FullName -Algorithm MD5    
}
$DestinationHash | Export-Csv -Path C:\Users\abcd\Desktop\CSVExports\DestinationHash.csv

#Comparing the hashes of Installer and Destination directories
Compare-Object -ReferenceObject (Import-Csv C:\Users\abcd\Desktop\CSVExports\InstallerHash.csv) -DifferenceObject (Import-Csv C:\Users\abcd\Desktop\CSVExports\DestinationHash.csv) -Property Hash | Export-Csv C:\Users\abcd\Desktop\CSVExports\ResultTable

你能再解释一下这个练习的用例吗?与在 PowerShell 中尝试执行此操作相比,我看起来其他一些工具(如适当的文件同步工具)在这方面效率更高。

无论如何,既然你问了:

  • 您需要多久检查一次哈希值?
  • 也许只检查最近更新的文件,而不是检查所有 12k 文件?
  • Posh v7支持foreach并行,可以加快处理速度。
param(
   $firstDirectoryName = "D:\tmp[=10=]1",
   $SecondDirectoryName = "D:\tmp[=10=]2"
)
$firstList = Get-ChildItem $firstDirectoryName -File -Recurse | ForEach-Object {
   [PSCustomObject]@{
      relativePath =  $_.FullName.TrimStart($firstDirectoryName)
      hash = (Get-FileHash $_.FullName -Algorithm MD5).Hash
   }
}
$secondList = Get-ChildItem $SecondDirectoryName -File -Recurse | ForEach-Object {
   [PSCustomObject]@{
      relativePath =  $_.FullName.TrimStart($SecondDirectoryName)
      hash = (Get-FileHash $_.FullName -Algorithm MD5).Hash
   }
}

Compare-Object -ReferenceObject  $firstList -DifferenceObject $secondList -Property relativePath, hash