Verwenden des Cmdlet \"Compare-Object\"

Vergleichen von zwei Objekten oder Textdateien

Compare-Object ist ein Cmdlet, das einige interessante Möglichkeiten bietet. Grundsätzlich vergleicht es zwei Objekte und teilt Ihnen mit, welche Unterschiede es gegebenenfalls zwischen den beiden Objekten gibt. Angenommen, Sie verwenden den folgenden Befehl, um Informationen über die aktuell auf einem Computer ausgeführten Prozesse in der Variablen $A zu speichern:

$A = Get-Process

Weiterhin nehmen wir an, Sie starten und beenden jetzt ein paar Anwendungen und speichern dann die neuesten Prozessinformationen in der Variablen $B.

$B = Get-Process

Damit erhalten Sie ein Objektpaar, das Informationen über die auf dem Computer ausgeführten Prozesse enthält. $A könnte beispielsweise die Prozesse darstellen, die um 10:00 Uhr ausgeführt werden, und $B die Prozesse, die um 10:30 Uhr (nur als Beispiel) ausgeführt werden.

Nachdem Ihnen diese beiden Objekte vorliegen, können Sie mit Hilfe von Compare-Object erkennen, welche Prozesse (wenn überhaupt) innerhalb der Zeitspanne zwischen $A und $B gestartet oder beendet wurden. Sie führen den folgenden Befehl aus:

Compare-Object $A $B

Sie erhalten eine Ausgabe wie die folgende:

InputObject                             SideIndicator
-----------                             -------------
System.Diagnostics.Process (EXCEL)      =>
System.Diagnostics.Process (freecell)   =>
System.Diagnostics.Process (notepad)    =>
System.Diagnostics.Process (dexplore)   <=

Das Zeichen => weist darauf hin, dass der betreffende Prozess (z. B. Freecell) in der Eigenschaftsmenge des zweiten Objekts, aber nicht in der Eigenschaftsmenge des ersten Objekts gefunden wurde. Das bedeutet, Freecell wurde zu einem Zeitpunkt gestartet, nachdem wir den ersten Satz an Prozessinformationen (die in $A abgelegten Daten) aufgezeichnet haben. Das Zeichen <= weist darauf hin, dass Dexplore in der Datenmenge von $A gefunden wurde, aber nicht in der Datenmenge von $B. Das kann nur bedeuten, dass die Anwendung zum Zeitpunkt der ersten Abfrage lief, aber beendet wurde, bevor der zweite Satz an Prozessinformationen aufgezeichnet wurde.

Mit anderen Worten, nachdem wir unsere erste Momentaufnahme der Prozesse angelegt hatten, wurden Excel, Freecell und Notepad gestartet und Dexplore beendet. Haben Sie erkannt, wie das Ganze funktioniert?

Compare-Object kann auch genutzt werden, um die Inhalte von zwei Textdateien zu vergleichen. Angenommen, wir haben zwei Dateien im Ordner "C:\Scripts". Die Datei "X.txt" enthält Folgendes:

Dies ist Zeile Nummer 1.
Zeile 2.
Dies ist Zeile Nummer 3.

Die Datei Y.txt dagegen sieht wie folgt aus:

Dies ist Zeile Nummer 1.
Dies ist Zeile Nummer 2.
Dies ist Zeile Nummer 3.

Um festzustellen, ob es Unterschiede zwischen den beiden Dateien gibt, wenden wir einfach den folgenden Befehl an:

Compare-Object $(Get-Content c:\scripts\x.txt) $(Get-Content c:\scripts\y.txt)

Compare-Object generiert den folgenden Bericht:

InputObject                             SideIndicator
-----------                             -------------
Dies ist Zeile Nummer 2.                  =>
Zeile 2.                                  <=

Beachten Sie, dass wir das Cmdlet Get-Content verwenden, um den Inhalt der beiden Textdateien zu laden, und dass jeder Get-Content-Befehl in Klammern eingeschlossen ist. Damit stellen wir sicher, dass wir Compare-Object Objekte (im Gegensatz zu beispielsweise Zeichenkettenwerten) übergeben. Letztlich haben wir damit einen einzigen Befehl erstellt, der aus den drei folgenden Einzelbefehlen besteht:

$A = Get-Content c:\scripts\x.txt
$B = Get-Content c:\scripts\y.txt
Compare-Object A$ B$

Wenn Sie einen zeilenweisen Vergleich der beiden Textdateien anzeigen wollen, fügen Sie den Parameter –includeequal hinzu:

Compare-Object $(Get-Content c:\scripts\x.txt) $(Get-Content c:\scripts\y.txt) -includeequal

Damit wird das folgende Ergebnis ausgegeben:

InputObject                             SideIndicator
-----------                             -------------
Dies ist Zeile Nummer 1.                  ==
Dies ist Zeile Nummer 3.                  ==
Dies ist Zeile Nummer 2.                  =>
Zeile 2.                                  <=

Aliase für "Compare-Object"

  • diff