2015-02-20 3 views
1

У меня было непросто время с этим, но я пытаюсь сделать сравнение между двумя серверами и сравнить их файлы с одного сервера на другой. Даже внутри подпапок. До сих пор мне приходилось сравнивать имена папок и файлы, но не могу заставить их заходить в папки и сравнивать содержимое. Вот несколько вещей, которые я пробовал.Сравните каталог с подпапками

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

Это то, с чего я начал, и он работает лучше всего, но по-прежнему не входит в подпапки. Я также пытался использовать инструкции foreach с массивами для хранения содержимого в массиве и сравнения массивов, но это, похоже, не работает вообще.

$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 

It ошибки на всех папках, говоря о запрете доступа, которая не имеет большого смысла для меня.

Спасибо, Andrew

ответ

1

Он должен работать, если задать свойство для сравнения:

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

Более надежным способом может быть использование ROBOCOPY robocopy.exe \\serverA\Folder1 \\serverB\Folder2 /e /l /log:c:\temp\dif.txt

+0

Когда я это делаю, он читает все в файлах и говорит, что у всех есть отличия, когда только несколько файлов действительно имеют отличия. – Andrew

+0

это будет работать, только если вы сравниваете каталоги с одним и тем же корнем (т.е. c: \ temp on как локальный, так и удаленный сервер), в противном случае полное имя будет отличаться. –

+0

Ну, я сравниваю сервер с сервером, а не локальным. – Andrew

0

Это должно дать вам разумное сравнение, я думаю. Вы можете использовать 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 

Это reuslts в выходе, как ...

InputObject              SideIndicator              
-----------              -------------              
\New folder\temp.txt            =>                 
\temp.txt               <=                 
\New folder\New folder\temp.txt         <=   

Update

Я думаю, что должен делать все, что вы ищете. Вам нужно будет изменить значения $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{} 
     } 
    } 
+0

Это только одно различие, которое было вне подпапок, сравнение все еще не ищет и сравнивает файлы в папках спасибо – Andrew

+0

Это не результат, который я испытываю. Я вижу результаты в файлах, которые существуют в одной области, но не в другом, начиная с первого каталога до третьего уровня. Я добавлю результаты, которые получаю в своем ответе. –

+0

Когда я запускаю его, он находит одно отличие. который является файлом, который находится на одном сервере, но не другим. Когда я выхожу за рамки сравнения, есть некоторая разница примерно в 3-4 разных конфигурациях внутри папки, которые не собираются – Andrew

0
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 
    } 

} 
+0

Кажется, это похоже на сравнение имен файлов. Мне тоже нужно сравнить контент. Спасибо – Andrew

+0

Да, но он найдет все файлы. Затем вы можете добавить свою логику сравнения. –

1

Я думаю, что 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 
 
     .\newdir\newfilesdir2.txt 
 
One file present in both directories and has different content: 
 
     .\modified.bin

Сценарий на основе этого gist так кредитного до cchamberlein.

Смежные вопросы