目录

时间:2018-03-19 00:46:39

标签: arrays powershell hash directory comparison

我正在编写一个脚本来比较两个目录。我希望脚本在输出中显示两个主要内容 - 哪些文件存在于一个目录中但不存在于另一个目录中,哪些文件出现在两个目录中但它们之间存在差异。匹配文件不需要显示。

之前我就如何实现这一点得到了一些建议,但由于我还是PS的新手,我在执行它时遇到了麻烦。我想要做的是:

  1. 我有路径#1。对于该路径中的每个文件,我想测试它们在Path#2上的存在​​。
  2. 如果文件存在于两个路径中,请在它们之间进行哈希比较。如果存在差异,请将文件添加到列表A。
  3. 如果文件出现在路径1而不是路径2中,请将它们放在列表B中。
  4. 这不是那么重要,但是也可以找到路径2中存在但不存在路径1的文件吗?出于工作目的,这可能无关紧要,但为了以防万一,它仍然会很好。
  5. 获取输出并对其进行格式化,使其显示如下内容:“路径1中存在以下文件,而不是路径2”,“以下文件存在于两个路径中但存在差异。”
  6. 基本上,我不仅希望将文件的信息转储作为输出,而且人们最终不得不通过它来解决问题。就像我说的那样,我认为我收到的关于如何做的建议会很好,我只是难以让它发挥作用。

    这是我到目前为止的代码:

    $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
    

    当我运行它时,我没有得到任何结果(除了文本输出)。我在哪里错了?

1 个答案:

答案 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 };

这种做法有点天真,因为它实际上只是检查文件名并忽略子文件夹树结构。但是,希望它会给你足够的跳跃点。