In der Skriptsprache Microsoft PowerShell werden Cmdlets verwendet, um drei Vorgänge auszuführen: Informationen sammeln, Informationen festlegen und Informationen löschen. Neben den Cmdlets bietet die PowerShell auch die Möglichkeit, Informationen mehrfach zu verarbeiten. Es gibt zwei integrierte PowerShell-Funktionen, die die meisten PowerShell-Admins verwenden. Diese sind ForEach-Schleife und ForEach-Objekt. Mit der PowerShell-ForEach-Schleife können Sie durch einen Satz von Elementen iterieren, die in einer PowerShell-Variablen gesammelt wurden. Beispielsweise können Sie mit dem PowerShell-Cmdlet „Get-ADUser“ Benutzerinformationen aus Active Directory sammeln. Wenn Sie die Stadteigenschaft jedes Benutzers ansehen müssen, bevor Sie eine Aktion ausführen, können Sie die ForEach-Schleife verwenden. Das ForEach-Objekt kann verwendet werden, um direkt mit Objekten zu arbeiten, und wird meist in einer Pipeline verwendet, wie wir in diesem Artikel erklären werden. Schauen wir uns einige Beispiele an, in denen die ForEach-Schleife und die ForEach-Object-Funktionen verwendet werden.
PowerShell ForEach-Schleife
Unser erstes Beispiel für die Verwendung der ForEach-Schleife ist die Überprüfung der Eigenschaft „city“ von Active Directory-Benutzern und die anschließende Durchführung einer Aktion. Nehmen wir an, Sie möchten Benutzer exportieren, deren Stadt-Eigenschaft auf „London“ gesetzt ist, und das Ergebnis in einer CSV-Datei speichern. Hier ist das PowerShell-Skript:
Wie Sie im obigen Skript sehen können, haben wir eine Variable namens $CityReport erstellt, die den Pfad für die CSV-Datei speichert, in der der Bericht gespeichert wird. Als Nächstes sammeln wir alle Benutzer aus einer bestimmten Organisationseinheit und speichern die gesammelten Benutzer mit allen Eigenschaften in der Variable $AllUsersNow. Als nächstes beginnt die Verarbeitung der ForEach-Schleife. In der ForEach-Schleifenfunktion wird die Eigenschaft „city“ des Benutzers überprüft und dann mit einer WENN-Bedingung überprüft, ob die Eigenschaft „city“ für den aktuellen Benutzer den Wert „London“ enthält oder nicht. Wenn der Benutzer den Wert „London“ in der Eigenschaft „city“ hat, werden die aktuellen Werte für den Benutzernamen und den Städtenamen zur Datei „C:\Temp\CityReport.CSV“ hinzugefügt.
Ein weiteres Beispiel für die Verwendung von ForEach Loop ist die Verarbeitung von Informationen, die in einer CSV-Datei gespeichert sind. Nehmen wir an, Sie haben eine CSV-Datei, die Werte für den Benutzernamen, die Stadt und die Abteilung enthält. Sie möchten die Eigenschaften des Orts und der Abteilung des Benutzers aus der CSV-Datei ändern. Dazu verwenden Sie das folgende PowerShell-Skript:
Wie Sie im obigen Skript sehen können, haben wir den Inhalt der CSV-Datei in die Variable „$CSVFile“ importiert und speichern dann mithilfe der ForEach-Schleife die Abteilungs- und Ortswerte aus der CSV-Datei in den Variablen „$NewDepartment“ und „$NewCity“ und aktualisieren dann mithilfe des PowerShell-Cmdlet „Set-ADUser“ die Abteilungs- und Ortswerte für den Benutzer.
Zusammenfassend lässt sich sagen, dass Sie die PowerShell-ForEach-Schleife verwenden, wenn Sie Informationen mehr als einmal verarbeiten müssen, wenn Sie eine Aktion für ein bestimmtes Element basierend auf dem Eigenschaftswert des Elements ausführen müssen und/oder wenn Sie Objektinformationen aus einer Datei ändern müssen.
Neben der ForEach-Schleifenfunktion bietet PowerShell auch ForEach-Object. Das ForEach-Object arbeitet, wie der Name schon sagt, direkt mit den Objekten und wird meist in einer Pipeline verwendet. Wie Sie beispielsweise im folgenden Befehl sehen können, ruft das Cmdlet „Get-Process“ alle Prozesse auf dem lokalen Computer ab, während „ForEach-Object“ nach der Pipeline (|) die Objekte (Prozessnamen) verarbeitet und dann nur den Prozessnamen im Ausgabefenster anzeigt.
Get-Process | ForEach-Object {$_.Prozessname}
Analog dazu, wenn Sie den Prozessnamen zusammen mit der Prozess-ID sehen möchten, führen Sie diesen Befehl aus:
Get-Process | ForEach-Object {$_.ProcessName, $_.ID}
Ein weiteres Beispiel für die Verwendung von ForEach-Object ist die Ermittlung der Länge aller Dateien in einem Verzeichnis. Nehmen wir an, Sie möchten die Länge aller Dateien im Ordner C:\Temp überprüfen. Sie führen diese Befehle aus:
$ThisDir = „C:\Temp“
Get-ChildItem $ThisDir | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; “ “ }}
Im folgenden ForEach-Object-PowerShell-Beispiel sammeln Sie Ereignisse aus dem Anwendungsereignisprotokoll und speichern dann die Ereignismeldung in einer Textdatei.
Take it from here
So haben Sie jetzt eine Vorstellung davon, wie Sie die integrierten PowerShell-Funktionen ForEach und ForEach-Object verwenden. Die PowerShell-ForEach-Schleife kann verwendet werden, um durch einen Satz von Elementen zu iterieren, die in einer PowerShell-Variablen gesammelt und in einer CSV-Datei gespeichert wurden. Die ForEach-Object-Funktion kann verwendet werden, um direkt mit Objekten zu arbeiten. Die Beispiele in diesem Artikel, in denen die ForEach-Schleife und die ForEach-Object-Funktionen verwendet werden, sollen Ihnen den Einstieg erleichtern und Ihnen Möglichkeiten aufzeigen, wie Sie die Befehle bei Ihrer Arbeit einsetzen können.