将目录与子文件夹进行比较



我在这方面遇到了困难,但我正在尝试在两台服务器之间进行比较,并让它们将一台服务器与另一台服务器的所有文件进行比较。甚至在子文件夹中。到目前为止,我已经用它来比较文件夹名称和文件,但无法进入文件夹并比较内容。以下是我尝试过的一些方法。

$A = Get-ChildItem -Recurse -path $Path
$B = Get-ChildItem -Recurse -path $PAth1
Compare-Object -ReferenceObject $A -DifferenceObject $B -PassThru

这是我开始的,它效果最好,但仍然没有进入子文件夹。我还尝试将foreach语句与Arrays一起用于将内容存储在数组中并比较数组,但这似乎根本不起作用。

$FileDirectoryA = "Path"
$FileDirectoryC = "path"
$A = foreach($folderA in Get-ChildItem $fileDirectoryA)
{
    $FolderA
}
$B = foreach($FileA in Get-ChildItem $ArrayA)
{
    $FileA
}
$C = foreach($folderC in Get-ChildItem $fileDirectoryC)
{
    $FolderC
}
$D = foreach($FileC in Get-ChildItem $ArrayC)
{
    $FileC
}
Compare-Object $B $D

当我尝试做时

Compare-Object $Path $Path2 

它在所有文件夹上都错误地说权限被拒绝,这对我来说没有多大意义。

谢谢,Andrew

如果您指定要比较的属性,它应该可以工作:

$a = ls c:temp -rec
$b = icm -computername $servername -scriptblock{ls c:temp -rec}
compare $a $b -Property fullname

更可靠的方法可能是使用自动复制robocopy.exe \serverAFolder1 \serverBFolder2 /e /l /log:c:tempdif.txt

我认为这个powershell脚本https://github.com/oflisback/dirdiff解决您的问题,它扫描两个目录并报告差异:

PS C:> dirdiff.ps1 C:dir1 C:dir2
One identical file:
        .identical.txt
One file only present in C:dir1:
        .newdir1.txt
2 files only present in C:dir2:
        .newdir2.txt
        .newdirnewfilesdir2.txt
One file present in both directories and has different content:
        .modified.bin

剧本就是基于这个要点,所以这要归功于切坎伯林。

Get-ChildItem $Source -Recurse | ForEach-Object{
   $Dest = Join-Path $Destination $_.FullName.Substring($Source.Length)
   $bool = Test-Path $Dest
   if(!$bool){
       #Write of some thing here to indicate difference
   }
}

我认为这应该会给你一个合理的比较。如果您愿意,可以在返回值上使用regex来重建原始文件路径。

$Dir1="C:Test"
$Dir2="C:Test2"
$A=(Get-ChildItem $Dir1 -Recurse).VersionInfo.Filename -replace [regex]::Escape($Dir1),""
$B=(Get-ChildItem $Dir2 -Recurse).VersionInfo.Filename -replace [regex]::Escape($Dir2),""
Compare-Object $A $B

这会重复输出,如。。。

InputObject                                                        SideIndicator                                                     
-----------                                                        -------------                                                     
New foldertemp.txt                                               =>                                                                
temp.txt                                                          <=                                                                
New folderNew foldertemp.txt                                    <=           

更新

我认为应该做你想要的一切。您需要更改$Dir1$Dir2的值。它可能过于复杂,但看起来确实有效。

$Dir1="C:Test"
$Dir2="C:Test2"
$Items1=Get-ChildItem $Dir1 -Recurse
$Items2=Get-ChildItem $Dir2 -Recurse
$A=$Items1.VersionInfo.Filename -replace [regex]::Escape($Dir1),""
$B=$Items2.VersionInfo.Filename -replace [regex]::Escape($Dir2),""
$Exist_Diff=Compare-Object $A $B
$Exist_Diff | %{
    $Current_Item=$_.InputObject
    if($_.SideIdicator -eq "<="){
        Write-Host "No file equivilent to $Dir1$Current_Item found in $Dir2"
        }else{
        Write-Host "No file equivilent to $Dir2$Current_Item found in $Dir1"
        }
    }
$Items1 | %{
    if ($Exist_Diff.InputObject -notcontains ($_.VersionInfo.Filename -replace [regex]::Escape($Dir1),""))
        {
        $MatchingFile=[string]$_.VersionInfo.Filename -replace [regex]::Escape($Dir1),$Dir2      
        try{if(Test-Path $MatchingFile)
            {
            if((Get-Item $MatchingFile).length -gt $_.Length)
                {
                Write-host $_.fullname "is larger than" $MatchingFile
                }
            }}catch{}
        }
    }
$Items2 | %{
    if ($Exist_Diff.InputObject -notcontains ($_.VersionInfo.Filename -replace [regex]::Escape($Dir1),""))
        {
        $MatchingFile=[string]$_.VersionInfo.Filename -replace [regex]::Escape($Dir2),$Dir1      
        try{if(Test-Path $MatchingFile)
            {
            if((Get-Item $MatchingFile).length -gt $_.Length)
                {
                Write-host $_.fullname  "is larger than" $MatchingFile
                }
            }}catch{}
        }
    }

相关内容

  • 没有找到相关文章

最新更新