Differenzen in zwei verschiedenen Verzeichnissen mittels Powershell Compare-Object ermitteln


Wer hatte das nicht schon Mal, man hat zwei Verzeichnisse und wo liegen jetzt die Unterschiede? Wobei von Aufgabe zu Aufgabe sich die Fragestellung noch verfeinert. Welche Dateien fehlen im einen oder im anderen Verzeichnis? Welches der Verzeichnis hat die neueren oder älteren Dateien?

Wie immer kommt Powershell zu Hilfe, mittels des Cmdlets Compare-Object. Leider sind die Beispiele bei Compare-Object sehr dünn, so dass nicht sofort alle Möglichkeiten ersichtlich sind.

Gegeben seien zwei Verzeichnisse, die so aussehen:

    Verzeichnis: C:\Temp\compare-object\org

Mode                LastWriteTime     Length Name
—-                ————-     —— —-
-a—        17.08.2011     08:46          7 file1.txt
-a—        17.08.2011     08:46          8 file2.txt
-a—        17.08.2011     08:46          8 file3.txt

und

    Verzeichnis: C:\Temp\compare-object\neu

Mode                LastWriteTime     Length Name
—-                ————-     —— —-
-a—        17.08.2011     08:46          7 file1.txt
-a—        17.08.2011     08:46          8 file3.txt
-a—        17.08.2011     08:46          8 file4.txt

Man will nun wissen, welche Dateien kamen neu hinzu?

$dr=gci c:\temp\compare-object\original\*.*
$dd=gci c:\temp\compare-object\neu\*.*
Compare-Object –ReferenceObject $dr –DifferenceObject $dd

Tja denkste, dies liefert:

InputObject                             SideIndicator
———–                             ————-
C:\temp\compare-object\neu\file1.txt    =>
C:\temp\compare-object\neu\file3.txt    =>
C:\temp\compare-object\neu\file4.txt    =>
C:\temp\compare-object\org\file1.txt    <=
C:\temp\compare-object\org\file2.txt    <=
C:\temp\compare-object\org\file3.txt    <=

Was soll das? Dies bedeutet das nichts identisch ist?!? Obwohl doch file1.txt und file3.txt in beiden Verzeichnissen existieren?

Die Ausgabe ist doch logisch denn zum Vergleich wir der komplette Pfadnamen herangezogen und somit ist ..\org\file1.txt ja nicht gleich ..\neu\file1.txt.

Also gibt man Compare-Object mit, was verglichen werden soll:

Compare-Object -ReferenceObject $dr -DifferenceObject
$dd -Property Name

das führt dann zu:

Name                                    SideIndicator
—-                                    ————-
file4.txt                               =>
file2.txt                               <=

Dies bedeutet jetzt das im Vergleich zum Originalverzeichnis also Referenzverzeichnis $dr die Datei file4.txt (=>) hinzugekommen ist und die Datei file2.txt (<=) entfernt wurde.

Wenn man jetzt .\neu\file1.txt ändert, sieht das Verzeichnis so aus:

    Verzeichnis: C:\Temp\compare-object\neu

Mode                LastWriteTime     Length Name
—-                ————-     —— —-
-a—        17.08.2011     09:07         16 file1.txt
-a—        17.08.2011     08:46          8 file3.txt
-a—        17.08.2011     08:46          8 file4.txt

Nun möchte man herausbekommen, welche Dateien sich vom Datum unterscheiden, dann könnte man

$dr=gci c:\temp\compare-object\original\*.*
$dd=gci c:\temp\compare-object\neu\*.*
Compare-Object –ReferenceObject $dr –DifferenceObject $dd -Property LastWriteTime

verwenden. Allerdings erscheint dann nur

LastWriteTime                           SideIndicator
————-                           ————-
17.08.2011 09:07:17                     =>
17.08.2011 08:46:45                     =>
17.08.2011 08:46:05                     <=
17.08.2011 08:46:15                     <=

Mittels

Compare-Object –ReferenceObject $dr –DifferenceObject $dd -Property LastWriteTime, Name

sieht die Sache dann besser aus:

LastWriteTime              Name                       SideIndicator
————-              —-                       ————-
17.08.2011 09:07:17        file1.txt                  =>
17.08.2011 08:46:45        file4.txt                  =>
17.08.2011 08:46:05        file1.txt                  <=
17.08.2011 08:46:15        file2.txt                  <=

Weitere sinnvolle Möglichkeiten und Beispiele gibts hier. Vor allem wird der SyncWindow-Parameter erläutert.

http://powershell.com/cs/blogs/tobias/archive/2009/01/09/tipps-amp-tricks-using-compare-object.aspx

Eine Antwort to “Differenzen in zwei verschiedenen Verzeichnissen mittels Powershell Compare-Object ermitteln”

  1. Quirel Says:

    Um die Ergebnismenge mit den Werten der Vergleichsobjekte zu bekommen gibt man -passthru mit an!

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s


%d Bloggern gefällt das: