Windows PowerShell: Die verschiedenen Wege zum angepassten Objekt

Es spielt keine Rolle, welchen Ansatz Sie wählen Sie für die Ausgabe benutzerdefinierter Objekte, so lange, wie ein benutzerdefiniertes Objekt Ihr Endergebnis ist.

Don Jones

Ich schrieb vor kurzem einen Blog-Post, die eine Reihe von umreißt 12 Empfehlungen für das Verwenden von Windows PowerShell. DieNo. 12 beste Praxis leitet Leute, um Objekte, die von ihren Skripts und Funktionen, statt der Ausgabe Text ausgegeben. Ich ging so weit zu behaupten, dass wenn Sie jemals die Cmdlet "Write-Host" verwendet haben, sollten Sie zurück Schritt und darüber nachdenken, was Sie taten. Alle Write-Host wird ist Text erzeugen.

Nicht lange nach, dass die Post live gegangen, kontaktiert mich ein Leser über den Code, den ich verwendet hatte, um das benutzerdefinierte Objekt zu erstellen. Er sagte, dass er noch nie gesehen hatte, dass Ansatz vor. Das war nicht verwunderlich, wie Windows PowerShell bieten ein Dutzend Möglichkeiten, etwas zu tun scheint. Er schlug vor, ich schreibe einen Artikel über die verschiedenen Möglichkeiten zum Erstellen eines benutzerdefinierten Objekts, so hier sind wir.

Der Full-Form-Weg

Dies ist die Art und Weise die meisten Menschen wahrscheinlich wählen würde, um ein benutzerdefiniertes Objekt zu erstellen. Es ist nenne ich "Lehrbuch Ansatz". Es hat den Vorteil, dass ziemlich klar, obwohl es eine Menge Tipparbeit beinhaltet. Unter der Annahme, dass ich ein Objekt in der Variablen $os, und eine weitere $ BIOS haben, kann ich ausgewählte Stücke von Informationen von ihnen wie folgt kombinieren:

$object = New-Object –TypeNamePSObject
$object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber
$object | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version
$object | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber
Write-Output $object

Sie können dieses Muster hinzufügen, was auch immer andere Informationen Sie müssen die endgültige Ausgabe-Objekt vor dem schreiben es auf die Pipeline weiter.

-PassThru: Eine kurze Verknüpfung

Dieser ersten Ansatz möglich etwas präziser, indem hinzufügen-Mitglied, das Objekt wieder in der Pipeline zu sagen:

$object = New-Object –TypeNamePSObject
$object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber –PassThru |
Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version –PassThru |
Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber
Write-Output $object

Wenn Sie eine Zeile mit ein Pipe-Zeichen enden, weiß Windows PowerShell um zu gehen in die nächste physikalische Zeile um für den nächsten Befehl in der Pipeline zu suchen. Im Wesentlichen ist es eine Möglichkeit, einen langen Befehl auf mehrere physische Zeilen aufteilen. Der Trick, kombiniert mit dem Schalter –PassThru dadurch eine Reihe von drei verschiedene Befehle.

Hashtable ein go-go

Während der bisherige Ansätze wirksam sind, sind sie auch sehr wortreich. In einem Skript kann es tatsächlich sein hart für Sie visuell feststellen, was passiert ist. Mithilfe der New-Funktion ist ein präziser Ansatz. Auf diese Weise können Sie ein Hashtable (oder ein assoziatives Array) erstellen, enthält die Eigenschaftsnamen und-Werte auf das neu erstellte Objekt hinzufügen möchten. Diese Eigenschaften werden jeweils automatisch als eine NoteProperty erstellt:

$properties = @{'OSBuild'=$os.BuildNumber;
                'OSVersion'=$os.version;
                'BIOSSerial'=$bios.SerialNumber}
$object = New-Object –TypeNamePSObject –Prop $properties
Write-Output $object

Dies hat die gleiche Wirkung, aber viel präziser ist. Einige kluge Leute nutzen ein Klammerausdrucks um zu machen, noch kürzer. Aber denke ich, dass dies macht es ein bisschen schwieriger zu lesen:

$object = New-Object –TypeNamePSObject –Prop
(@{'OSBuild'=$os.BuildNumber;
                'OSVersion'=$os.version;
                'BIOSSerial'=$bios.SerialNumber})
Write-Output $object

Ein wenig weiter zu gehen

Sie werden bemerken, dass in all diesen Beispielen, ich das benutzerdefinierte Objekt einer Variablen ($Objekt) speichern bevor es in die Pipeline geschrieben. Der Grund dafür ist einfach. Sie können das Objekt ein bisschen mehr zu bearbeiten. Beispielsweise können Sie dem Objekt einen benutzerdefinierten Typ-Namen geben:

$object.PSObject.TypeNames.Insert(0,'My.Custom.Name')

Auf diese Weise können Sie eine benutzerdefinierte Standardformatierung Layout für die Anzeige Ihres Objekts erstellen. Ich habe diesen Trick mit großem Erfolg in "Windows PowerShell-Skripting und Werkzeugbau" (Concentrated Technology und Schnittstelle technische Schulungen, 2011), ein kurzes Buch, die ich, dass schrieb konzentriert sich auf Dinge wie die Verwendung von benutzerdefinierter Objekten als Ausgabe von maßgeschneiderte Windows PowerShell-Tools.

Different Strokes for different folks

Es gibt keine "falsche" Weg, etwas zu tun in Windows PowerShell, solange Ihr Ansatz den Job zu erledigen ruft. Das heißt, es gibt einige Ansätze ich vermeiden, vor allem, weil sie weniger lesbar und schwieriger zu unterrichten sind – vor allem die Neuankömmlinge. Hier ist eine, noch davon aus, dass meine $os und Bios-Variablen $ die Roh-Objekte enthalten möchte ich zum Extrahieren von Informationen aus:

$os | Select-Object –Property @{n='OSVersion';e={$_.Version}},
@{n='OSBuild';e={$_.BuildNumber}},
@{n='BIOSSerial';e={$bios.SerialNumber}}

Sie werden die gleichen Ergebnisse wie die vorherigen Beispiele generieren, aber die Syntax ist erschreckend. Es gibt viel der Interpunktion, haben viele der Struktur, und Sie zu viel über das, was Select-Object mit diesen drei Hashtabellen tut verstehen.

Es ist im Grunde benutzerdefinierte Eigenschaften mithilfe einer Syntax für dieses Cmdlet eindeutig (und von der Format-Cmdlets) generieren. Sie sehen, dass Leute mit Software Entwicklung-Stil Hintergrund verwendete Syntax. Es ist schwieriger für mich (und viele andere Leute), geistig zu analysieren, so dass ich tendiere dazu, nicht so viel verwenden.

PowerShell ist nichts, wenn nicht flexibel

Windows PowerShell ist einzigartig, da es Sie mit einige verrückte Sachen weg erhalten kann. Beispielsweise gehen Sie zurück zu meinem Beispiel Hashtable. Sie können es auch auf diese Weise tun:

$info = @{}
$info.OSBuild=$os.BuildNumber
$info.OSVersion=$os.version
$info.BIOSSerial=$bios.SerialNumber
$object = New-Object –TypeNamePSObject –Prop $info
Write-Output $object

Sie erstellen eine leere Hashtable, dann Informationen hinzufügen, indem Sie auf Eigenschaften, die nicht existieren. Wenn Sie zunächst versuchen, OSBuild zugreifen, erkennt z. B. Windows PowerShell, dass keine solche Eigenschaft in das $Info-Objekt vorhanden ist (was eine leere Hashtable). Es implizit die Eigenschaft erstellt und weist Ihr Wert. Verrückte Sachen — aber es funktioniert.

Der moralische steht: Objekte, nicht Text

Aber Sie benutzerdefinierte Objekte erstellen möchten, erstellen Sie benutzerdefinierte Objekte anstelle von nur Text im Konsolenfenster ausgegeben. Objekte sind unendlich viel flexibler, und lassen sie Ihre Skripts oder Funktion Ausgabe mit allem, was sonst Windows PowerShell integrieren.

Don Jones

Don Jones ist ein Microsoft MVP Award Empfänger und Autor von "Lernen Sie Windows PowerShell in ein Monat der Mittagessen" (Manning Publications, 2011), ein Buch entwickelt, um jedem Administrator mit Windows PowerShell wirksam. Jones bietet öffentlichen und vor-Ort-Training an Windows PowerShell. Erreichen Sie ihn über seine Website ConcentratedTech.com.

Verwandte Inhalte