Vergleich von Objekten mit PowerShell (Schritt-für-Schritt-Anleitung)

Natürlich, das Vergleichen von Dateien oder Dateiinhalten in Windows ist etwas, das Sie im Laufe der Jahre gemacht haben. Aber belastet das nicht irgendwann Ihre Augen, wenn Sie Dateien und Inhalte visuell vergleichen? Nun, Glück für Sie, Sie können Objekte mit PowerShell genau so vergleichen, wie Sie es möchten, mit dem Compare-Object-Befehl.

In diesem Tutorial lernen Sie, Objekte mit PowerShell zu vergleichen, wie Dateien oder Dateiinhalte, während Sie die Ausgabe anpassen.

Schonen Sie Ihre Augen und vergleichen Sie Objekte effektiv!

Voraussetzungen

Dieses Tutorial wird eine praktische Demonstration sein, aber solange Sie einen Windows-PC mit PowerShell haben, sind Sie bereit. PowerShell-Version 5.1 wird in diesem Tutorial verwendet.

Vergleich von Dateiinhalten

Stellen Sie sich vor, Sie haben zwei verschiedene Dateien mit demselben Inhalt. Wie würden Sie wissen, ob beide Dateien denselben Inhalt haben? Das Ausführen des Get-Content-Befehls könnte die Lösung sein. Der Get-Content-Befehl ruft den Inhalt einer Datei von einem angegebenen Speicherort ab.

Öffnen Sie PowerShell und führen Sie die unten stehenden Befehle aus, um den Inhalt (Get-Content) der angegebenen Dateien in Variablen ($file1 und $file2) zu erhalten. Ersetzen Sie den unten stehenden Pfad durch den Pfad Ihrer gewählten Dateien, die Sie vergleichen möchten.

# Den Inhalt der Textdateien in Variablen erfassen
$file1 = Get-Content C:\\Temp\\File1.txt
$file2 = Get-Content C:\\Temp\\File2.txt
Storing Text File Contents to PowerShell Variables

Führen Sie nun den unten stehenden Compare-Object-Befehl aus, um den Inhalt von $file (-ReferenceObject) mit $file2 (-DifferenceObject) zu vergleichen.

Standardmäßig zeigt Compare-Object nicht die Werte an, die in beiden Variablen vorhanden sind. Fügen Sie als Lösung den Parameter -IncludeEqual hinzu, um die Werte in der Ausgabe anzuzeigen.

Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -IncludeEqual

Aus der unten stehenden Ausgabe gibt das SideIndicator an, ob beide Dateien den gleichen Inhalt (pro Zeile) haben oder nicht:

SideIndicator Definition
== Indicates the content is present in both files ($file1 and $file2).
=> Indicates the content only exists in the -DifferenceObject file ($file2).
=> Indicates the content only exists in the -ReferenceObject file ($file1).
Comparing File Contents

Vielleicht ziehen Sie es vor, Zeichenketten mit Groß- und Kleinschreibung zu vergleichen. Wenn ja, fügen Sie den Parameter -CaseSensitive hinzu, da der Compare-Object-Befehl standardmäßig nicht auf Groß- und Kleinschreibung achtet.

Führen Sie die unten stehenden Befehle aus, um $file1 mit $file2 zu vergleichen, sowohl mit als auch ohne Groß- und Kleinschreibung.

# Vergleich des Dateiinhalts mit dem Parameter -CaseSensitive
Compare-Object $file1 $file2 -CaseSensitive
# Vergleich des Dateiinhalts ohne den Parameter -CaseSensitive
Compare-Object $file1 $file2

Wie Sie unten sehen können, zeigt der Compare-Object-Befehl ohne den -CaseSensitive-Parameter powershell nicht im Ausgabebereich an.

Compare Objects wth PowerShell : Comparing File Contents with Case Sensitivity

Das Vergleichen von Zeichenfolgen funktioniert ähnlich wie das Vergleichen von Dateiinhalten, bei dem Sie entweder die Zeichenfolgen explizit angeben oder Variablen verwenden können, um die zu vergleichenden Zeichenfolgen darzustellen. Beachten Sie, dass der Compare-Object-Befehl Quellzeichenfolgen vergleicht und nicht einzelne Zeichen.

Vergleich von Listen von Dateien aus verschiedenen Orten

Jetzt, da Sie wissen, wie Sie Dateiinhalte vergleichen können, warum nicht tatsächliche Dateien aus verschiedenen Orten vergleichen? Das Vergleichen von Listen von Dateien ist nützlich, wenn Sie zwei verschiedene Server verwalten, auf denen Sie denselben Ordner für einen Dienst mit denselben Dateien haben.

Diesmal verwenden Sie den Get-ChildItem-Befehl, um die Liste der Dateien in einem Ordner abzurufen und mit der Liste der Dateien eines anderen Ordners zu vergleichen.

Führen Sie die folgenden Befehle aus, um die Dateilisten von C:\Temp\Folder1\ und C:\Temp\Folder2\ abzurufen und die Listen in den Variablen $Folder1List und $Folder2List zu speichern.

# Erfassen Sie die Liste der Dateinamen in Variablen
$Folder1List = Get-ChildItem C:\\Temp\\Folder1\\
$Folder2List = Get-ChildItem C:\\Temp\\Folder2\\
# Vergleichen der Listen
Compare-Object $Folder1List $Folder2List -IncludeEqual

Sie können auch den Parameter -Recurse im Get-ChildItem-Befehl verwenden, um rekursiv eine Liste von Dateien in Unterordnern abzurufen.

Comparing Files in Different Folders

Vergleichen von Objekten mit PowerShell nach Eigenschaften

Sie haben gerade Dateien an verschiedenen Orten verglichen, aber Sie möchten möglicherweise eine weitere Option hinzufügen, um Dateien nach Eigenschaften zu vergleichen. In dieser Demo vergleichen Sie Dateien nach dem letzten Zugriffszeitpunkt.

Führen Sie die folgenden Befehle aus, um Dateien aus verschiedenen Ordnern ($Folder1 und $Folder2) nach dem letzten Zugriffszeitpunkt zu vergleichen.

# Abrufen der Liste der Dateien aus den angegebenen Dateien
$Folder1 = Get-ChildItem C:\\Temp\\Folder1\\ -Recurse
$Folder2 = Get-ChildItem C:\\Temp\\Folder2\\ -Recurse
# Dateien nach letzter Zugriffszeit vergleichen mit Dateinamen
Compare-Object $Folder1 $Folder2 -Property name,lastaccesstime
Listing Compared Files using the lastaccesstime Parameter

Vergleich von Prozessen und Diensten

Die Möglichkeiten des Befehls Compare-Object sind nicht darauf beschränkt, nur Zeichenfolgen oder Inhalte in Dateien zu vergleichen. Sie können auch Prozesse, Dienste usw. vergleichen.

Vielleicht möchten Sie Dienste zwischen zwei Servern erfassen. Wenn ja, können Sie die Dienste in Variablen speichern und vergleichen.

Führen Sie die folgenden Befehle aus, um Dienste zwischen zwei verschiedenen Servern ($server1 und $server2) zu vergleichen.

# Die Dienstliste in Variablen erfassen
$server1 = Get-Service -ComputerName jumpbox
$server2 = Get-Service -ComputerName AD
# Dienste auf beiden Servern vergleichen und nach dem Dienstnamen sortieren
Compare-Object $server1 $server2 -PassThru | sort name| select name,status,machinename
Comparing Services Between Two Servers

Wenn Sie Prozesse vergleichen möchten, sind die auszuführenden Befehle ähnlich wie beim Vergleich von Diensten. Sie können auch Prozesse auf demselben Computer oder auf zwei verschiedenen Servern vergleichen.

Führen Sie die untenstehenden Befehle aus, um laufende Prozesse von zwei Maschinen (Jumpbox und AD-Server) in Variablen zu erfassen und zu vergleichen.

# Holen Sie die Prozessliste von entfernten Servern in PowerShell-Variablen
$server1Process = Get-Process -ComputerName Jumpbox
$server2Process = Get-Process -ComputerName AD
# Vergleichen Sie Prozesse von zwei Servern und listen Sie Prozessnamen und den entsprechenden Servernamen im Ausgabebereich auf
Compare-Object $server1Process $server2Process -PassThru | sort name  |select name,machinename,sideindicator
Comparing Processes Between Two Servers

Identifizierung von Aktivitäten durch Vergleich von Prozesslisten

Der Compare-Object-Befehl ist auch in bestimmten Fehlerbehebungsszenarien hilfreich. Wie? Sie können laufende Prozesse in eine Variable erfassen und Ihre Aktivität starten. Dann erfassen Sie die laufenden Prozesse in einer neuen Variable und vergleichen die neuen Prozesse.

Führen Sie die unten stehenden Befehle aus, um Aktivitäten zu identifizieren, indem Sie zwei verschiedene Listen erfasster Prozesse vergleichen.

# Erfassen Sie Prozesse, bevor Sie Ihre Aktivität starten.
$Initial_Process = Get-Process
# Notepad öffnen (Ihre Aktivität)
notepad
# Erfassen Sie Prozesse, nachdem Ihre Aktivität abgeschlossen ist.
$New_Process = Get-Process
# Vergleich von Anfangs- und Neuprozeß
Compare-Object $Initial_Process $New_Process -PassThru | select processname,sideindicator
Identifying New Processes on Local PC

Vergleich von Benutzern zwischen verschiedenen Active Directory-Gruppen

Wenn Sie dieselbe Benutzermenge aus verschiedenen AD-Gruppen verwalten, ist der Vergleich der Benutzerliste mit dem Compare-Object-Befehl hilfreich. Dadurch können Sie genau überwachen, ob ein Benutzer in einer der beiden unterschiedlichen AD-Gruppen fehlt.

Führen Sie die unten stehenden Befehle aus, um Benutzer zwischen zwei verschiedenen AD-Gruppen zu vergleichen (staticvmusers und vdivmusers).

# Importieren Sie das Active Directory-Modul, um die Befehle Get-ADGroup und Get-ADUser auszuführen.
Import-Module ActiveDirectory
# Speichern Sie die Benutzerliste aus verschiedenen AD-Gruppen in Variablen.
$FirstGroup = Get-ADGroup staticvmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
$SecondGroup = Get-ADGroup vdivmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
# Führen Sie das Cmdlet Compare-Object aus, um Benutzer in diesen beiden AD-Gruppen zu vergleichen.
Compare-Object ($FirstGroup) ($SecondGroup) -Property 'SamAccountName' -IncludeEqual
Comparing Users in Two AD Groups

Schlussfolgerung

In diesem Tutorial haben Sie gelernt, wie Sie Objekte mit PowerShell auf verschiedene Weise vergleichen können, von Dateiinhalten bis hin zu Benutzern in AD-Gruppen. Sie haben erkannt, dass das Compare-Object-Cmdlet eine schnelle Lösung zum Vergleichen von Dateien, Diensten, Prozessen usw. ist.

Sie haben grundlegende Kenntnisse im Umgang mit dem Compare-Object-Cmdlet erlangt. Warum bauen Sie dieses neu gefundene Wissen nicht weiter aus, indem Sie leistungsstarke PowerShell-Vergleichsarrays erlernen?

Source:
https://adamtheautomator.com/compare-objects-with-powershell/