对文件名及其在源/目标文件夹不同深度的唯一性进行了一些假设:
$SourceDir = "C:\\temptest";
$DestDir = "D:\\temptest";
$SourceFiles = @(Get-ChildItem -Recurse -Path $SourceDir);
$DestFiles = @(Get-ChildItem -Recurse -Path $DestDir);
$SourceFileNames = $SourceFiles | % { $_.Name };
$DestFileNames = $DestFiles | % { $_.Name };
$MissingFromDestination = @();
$MissingFromSource = @();
$DifferentFiles = @();
foreach($f in $SourceFiles) {
if (!$DestFileNames.Contains($f.Name)) {
$MissingFromDestination += $f;
} else {
$t = $DestFiles | Where { $_.Name -eq $f.Name };
if ((Get-FileHash $f.FullName).hash -ne (Get-FileHash $t.FullName).hash) {
$DifferentFiles += $f;
}
}
}
foreach($f in $DestFiles) {
if (!$SourceFileNames.Contains($f.Name)) {
$MissingFromSource += $f;
}
}
"
Missing from Destination: "
$MissingFromDestination | % { $_.FullName };
"
Missing from Source: "
$MissingFromSource | % { $_.FullName };
"
Source is Different: "
$DifferentFiles | % { $_.FullName };
这种方法有点幼稚,因为它实际上只检查文件名,而忽略子文件夹树结构。但是,希望它能给你足够的跳跃点。