Beim Schreiben von PowerShell-Skripten suche ich oft nach bestimmten Daten, speichere diese Daten in einem Objekt und exportiere sie dann meistens in das CSV-Format. Dieser Artikel zeigt Ihnen, wie Sie all dies mit PSObject
erledigen können.
Die einfachste Art, Daten für ein Objekt zu speichern, ist das Speichern mit einem PSObject
. Wenn Sie mehrere Objekte haben, für die Sie Daten speichern müssen, dann können Sie jedes PSObject
in einem Array speichern. Dieses Array kann dann in eine CSV-Datei exportiert werden.
Eine PSObject
ist einer Hashtabelle sehr ähnlich, in der Daten in Schlüssel-Wert-Paaren gespeichert werden. Sie können für jede PSObject
beliebig viele Schlüssel-Wert-Paare erstellen.
Erstellen eines PSObject
Wie bereits erwähnt, verwendet die PowerShell PSObject
eine Struktur vom Typ Schlüssel-&Wertpaar. Um Daten in der PSObject
zu speichern, müssen Sie lediglich einen Schlüssel definieren und dann einen Wert in dem Schlüssel speichern. In den folgenden Beispielen wird eine neue PSObject
erstellt und einige Daten in diesem Objekt gespeichert. In diesem Beispiel werden zwei „Schlüssel“ (Key1 und Key2) erstellt. Jeder von ihnen enthält Daten über das Objekt (Value1 und Value2).
In einem realen Szenario enthalten Schlüssel und Werte Informationen über das Objekt. Wenn wir also zum Beispiel Informationen über eine Datei speichern, wären einige der Schlüssel-Wert-Paare, die wir erstellen könnten, Name, FileExtension, Path und Size.
Hier ist die Vorgehensweise zum Erstellen eines PSObject
sowohl in PowerShell 2.0 und 3.0 und höher:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & oben
In PowerShell 3.0 und höher wird empfohlen, den folgenden Code zum Erstellen einer PSObject
zu verwenden. Dies liegt daran, dass die Reihenfolge jedes erstellten Schlüsselwerts beibehalten wird, was bedeutet, dass beim Exportieren in CSV die Sortierreihenfolge beibehalten wird.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Speichern mehrerer PSObjekte in einem Array
Bislang haben wir uns mit dem Speichern von Informationen über ein einzelnes Objekt (z. B. eine Datei) beschäftigt. Was aber, wenn wir einen Ordner aufzählen und Informationen über alle Dateien in diesem Ordner speichern müssen? In diesem Fall würden wir eine PSObject
für jede Datei erstellen (um ihre individuellen Daten zu speichern) und dann alle diese PSObjekte in einem Array speichern. Dies macht es sehr einfach, Informationen für mehrere Objekte zu speichern und zu exportieren.
Hier sehen Sie, wie Sie ein PSObjekt in einem Array speichern. Um dies für mehrere Dateien zu tun, musst du nur innerhalb der ForEach
-Schleife folgendes tun:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Ein Beispiel aus der realen Welt
Lassen Sie uns ein schnelles Beispiel einrichten, um bei der Demonstration zu helfen. In diesem Beispiel werden wir Folgendes tun:
Lesen einer Textdatei mit einer Liste von Mitarbeiternamen. Für jeden Namen wird in AD nachgeschlagen und einige zusätzliche Informationen gesammelt, einschließlich Benutzername und E-Mail-Adresse. Diese Daten werden dann als CSV-Datei ausgegeben.
Beispiellösung
Das folgende Skript zählt alle Mitarbeiternamen in der Textdatei auf und durchsucht für jeden Namen das AD nach zusätzlichen Mitarbeiterinformationen. Jede dieser Daten wird in einem eigenen PSObjekt mit dem Namen $hItemDetails
gespeichert.
Um sicherzustellen, dass die Daten in der richtigen Reihenfolge sind, wenn sie in CSV exportiert werden, verwenden wir die @{}
-Methode zum Erstellen eines neuen PSObject
(nur in PowerShell 3.0 und höher verfügbar). Da es mehrere Mitarbeiter gibt, speichere ich jedes PSObject in einem Array namens $aResults
. Dieses Array wird dann in eine CSV-Datei exportiert.
Import-Module ActiveDirectory$aResults = @()$List = Get-Content "C:\Temp\List.txt" ForEach ($Item in $List) { $Item = $Item.Trim() $User = Get-ADUser -Filter { displayName -like $Item -and SamAccountName -notlike "a-*" -and Enabled -eq $True } -Properties SamAccountName, GivenName, Surname, telephoneNumber $sEmail = $User.GivenName + "." + $User.Surname + "@test.com" $hItemDetails = @ { FullName = $Item UserName = $User.SamAccountName Email = $sEmail Tel = $User.telephoneNumber } #Add data to array $aResults += $hItemDetails}$aResults | Export-CSV "C:\Temp\Results.csv"