Come diffondo due cartelle in Windows Powershell?


11

Sto cercando di trovare differenze nel contenuto di due strutture di cartelle utilizzando Windows Powershell. Ho usato il seguente metodo per assicurarmi che i nomi dei file siano gli stessi, ma questo metodo non mi dice se il contenuto dei file è lo stesso:

$firstFolder = Get-ChildItem -Recurse folder1
$secondFolder = Get-ChildItem -Recurse folder2
Compare-Object -ReferenceObject $firstFolder -DifferenceObject $secondFolder

La tecnica descritta in questa domanda ServerFault funziona per diffondere un singolo file, ma queste cartelle contengono centinaia di file a varie profondità.

Non è necessario che la soluzione mi dica cosa è specifico nei file, ma solo che lo sono. Non mi interessano le differenze nei metadati come la data, che già so essere diversa.

Risposte:


15

Se si desidera racchiudere il confronto in un ciclo, seguirei il seguente approccio:

$folder1 = "C:\Users\jscott"
$folder2 = "C:\Users\public"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$firstFolder | ForEach-Object {

    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {

        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {

            # List the paths of the files containing diffs
            $_.FullName
            $_.FullName.Replace($folder1, $folder2)

        }
    }   
}

Si noti che questo ignorerà i file che non esistono in entrambi $folder1 e $folder2.


5

Ho preso la risposta di jscott e l'ho ampliata per produrre i file presenti in uno ma non nell'altro per coloro che sono più interessati a quel tipo di funzionalità. Si noti che mostra anche i progressi compiuti dal momento che per me è stato difficile vederlo dato le enormi cartelle con non molte differenze. Sembrava che la sceneggiatura mi fosse stata appesa. Ecco il codice PowerShell per questo:

$folder1 = "C:\Folder1"
$folder2 = "C:\Folder2"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$failedCount = 0
$i = 0
$totalCount = $firstFolder.Count
$firstFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching Files" -status "Searching File  $i of     $totalCount" -percentComplete ($i / $firstFolder.Count * 100)
    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {
        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {
            # List the paths of the files containing diffs
            $fileSuffix = $_.FullName.TrimStart($folder1)
            $failedCount = $failedCount + 1
            Write-Host "$fileSuffix is on each server, but does not match"
        }
    }
    else
    {
        $fileSuffix = $_.FullName.TrimStart($folder1)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 1"
    }
}

$secondFolder = Get-ChildItem -Recurse $folder2 | Where-Object { -not $_.PsIsContainer }

$i = 0
$totalCount = $secondFolder.Count
$secondFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching for files only on second folder" -status "Searching File  $i of $totalCount" -percentComplete ($i / $secondFolder.Count * 100)
    # Check if the file, from $folder2, exists with the same path under $folder1
    If (!(Test-Path($_.FullName.Replace($folder2, $folder1))))
    {
        $fileSuffix = $_.FullName.TrimStart($folder2)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 2"
    }
}

Perché estrarre il contenuto effettivo di un file quando si chiama Compare-Object? Ecco cosa fa Compare-Object. technet.microsoft.com/en-us/library/…
Casper Leon Nielsen

1

Basta avvolgere un ciclo attorno alla risposta corretta dalla domanda collegata che ha già risposto a questa domanda e percorrere l'albero delle directory confrontando ogni file con lo stesso nome.

/ Modifica: se questa è effettivamente la tua domanda, è più appropriato per SO, in cui sembri essere un collaboratore regolare. Stai facendo una domanda di programmazione. Capisco che lo stai facendo per uno scopo di tipo sysadmin, nel qual caso, ti direi di utilizzare uno strumento appositamente progettato come WinDiff.


2
OK, questo sito non è appropriato per le domande di tipo "Dammi il codez". Se devi iniziare a imparare come fare i loop in Powershell, acquista un libro o trova tutorial online; ci sono molti.
mfinni,

2
Penso che ti sia svegliato dalla parte sbagliata del letto. Non sono un normale utente Powershell. Nella mia domanda ho dimostrato sia una tecnica che sto tentando attualmente sia un collegamento a una domanda che contiene ulteriori informazioni utili per il mio problema. Non so come combinare le due tecniche, che è il mio problema, e il motivo per cui ho posto questa domanda. È anche una domanda a cui non sono stato in grado di rispondere utilizzando le ricerche di Google. Se non ti sarà d'aiuto, ti preghiamo di considerare di eliminare la tua risposta.
David Smith,

2
@BigDave Letteralmente il primo risultato per PowerShell loop through filessu Google . dai adesso - un piccolo sforzo da parte tua?
voretaq7,

2
@ voretaq7 Penso che voi mi fraintendiate come utente di PowerShell. Ho fatto quella ricerca su Google, ho provato quella tecnica e non ci sono riuscito. Ho cercato di spiegare dove mi trovo nella domanda sopra. La domanda a cui ti colleghi funziona su un singolo set di file. Ho due set che devo confrontare, nome-a-nome. Non sto davvero cercando di essere pigro qui. So fare il ciclo e so come confrontare. Come faccio ad eseguire il loop e confrontare due set?
David Smith,

1
Penso che farlo con PS sia un piccolo grande progetto. Tuttavia, WinMerge (pensato che fosse WinDiff, sciocco me) è davvero un ottimo strumento se lo farai molto spesso. È letteralmente costruito per il lavoro. Provalo, il download è gratuito. Ha decompositori per la maggior parte dei tipi di file e fa un ottimo lavoro di evidenziazione, comprese le opzioni su come si desidera gestire gli spazi bianchi.
mfinni,

0

Fai questo:

compare (Get-ChildItem D:\MyFolder\NewFolder) (Get-ChildItem \\RemoteServer\MyFolder\NewFolder)

E anche in modo ricorsivo:

compare (Get-ChildItem -r D:\MyFolder\NewFolder) (Get-ChildItem -r \\RemoteServer\MyFolder\NewFolder)

ed è persino difficile da dimenticare :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.