我正在编写一个脚本来比较两个目录。我希望脚本在输出中显示两个主要内容 - 哪些文件存在于一个目录中但不存在于另一个目录中,哪些文件出现在两个目录中但它们之间存在差异。匹配文件不需要显示。
之前我就如何实现这一点得到了一些建议,但由于我还是PS的新手,我在执行它时遇到了麻烦。我想要做的是:
基本上,我不仅希望将文件的信息转储作为输出,而且人们最终不得不通过它来解决问题。就像我说的那样,我认为我收到的关于如何做的建议会很好,我只是难以让它发挥作用。
这是我到目前为止的代码:
$Source = @(Get-ChildItem -Recurse -Path \\SERVER\D$\PSTest)
foreach ($file in $Source){
If ($Target = Test-Path @(Get-ChildItem -Recurse -Path \\SERVER\D$\PSTest))
{
$HashResult = (Compare-Object -ReferenceObject $file -DifferenceObject
$Target -Property hash -PassThru).Path
}
else {
$Missing += $file
}
}
Write-Host 'These files have differences.' -ForegroundColor Green
$HashResult
Write-Host 'These files are missing from the target path.' -ForegroundColor
Green
$Missing
当我运行它时,我没有得到任何结果(除了文本输出)。我在哪里错了?
答案 0 :(得分:0)
在源/目标文件夹的各个深度下对文件名及其唯一性做了一些假设:
$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 };
这种做法有点天真,因为它实际上只是检查文件名并忽略子文件夹树结构。但是,希望它会给你足够的跳跃点。