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"

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.