Windows PowerShell: Verknüpfungssyntax

In der Regel gibt es in Windows PowerShell immer mehrere Möglichkeiten, einen Vorgang auszuführen. Suchen Sie sich die Methode aus, die für Sie am besten funktioniert, und bleiben Sie dabei.

Don Jones

Eines der Dinge, die ich Liebe und hasse über Windows PowerShell ist seine inhärenten Flexibilität. In vielerlei Hinsicht ist es wie eine Programmiersprache geschrieben. Wenn Sie kein Programmierer sind, können Sie ziemlich ignorieren, und behandeln sie wie eine Befehlszeilen-Shell.

Ignorieren Sie nun, vielleicht nicht ganz"". Sie sehen, scheint es immer drei oder vier verschiedene Möglichkeiten, fast alles in Windows PowerShell tun werden. Sie benötigen eigentlich nur eine Möglichkeit kennen, die für Sie am sinnvollsten ist. Ein intelligente Windows PowerShell-Benutzer, wird jedoch mit allen Mitteln, um eine bestimmte Aufgabe vertraut sein. So, wenn Sie auf Beispiele geschrieben von anderen Menschen suchen, werden Sie in der Lage, den Sinn von was Sie sehen.

Alles über den Alias

Aliase sind die ersten "Verknüpfung" die meisten von Ihnen begegnen werden. Betrachten Sie dieses Befehl:

PS C:\> Get-WmiObject -class Win32_LogicalDisk -Filter "DriveType=3" | >> Where-Object -FilterScript{ $_.FreeSpace / $_.Size -lt .1 } | >> Select-Object -Property DeviceID,FreeSpace,Size >>

Sie können Tastenkombinationen wie es damit:

PS C:\>gwmi Win32_LogicalDisk -Fi "DriveType=3" | >> ?{ $_.FreeSpace / $_.Size -lt .1 } | >> SelectDeviceID,FreeSpace,Size >>

Ich habe Aliasnamen anstelle des Befehlsnamen verwendet, und ich habe Parameter weniger Zeichen abgeschnitten. Windows PowerShell können Sie die Parameternamen abschneiden, solange Sie bieten genug von jedem Parameternamen nicht eindeutig identifiziert werden. Dies führt zu weniger eingeben, aber ein viel mehr schwierig zu lesende-Kommando. Ich rate meinen Schülern alles zu buchstabieren, wenn sie ein Beispiel veröffentlichen, speichern es in einem Skript oder sonst macht es einen ständigen Artefakt. Dies wird später identifizieren erleichtern.

In der Windows PowerShell-ISE und die meisten anderen Editoren können Sie den abgeschnittenen Teil des Parameternamens und drücken Tab, um den gesamten Namen eingegeben. Es gibt weniger eingeben — und es ist leichter zu lesen. Ich habe andere Parameternamen, komplett weggelassen, weil sie positionelle Parameter sind. Mit anderen Worten, solange ich mich erinnere, alle Werte in der richtigen Reihenfolge aufgereiht zu erhalten, funktioniert der Befehl immer noch.

Wieder, abgeschnittene Namen sind nicht leicht zu lesen. Die meisten Menschen schätzen Sie mit dem voll-Parameter-Namen in einem Skript. Mit den voll-Parameter-Namen ist letztlich weniger Arbeit auf Sie, weil Sie nicht daran sie in kommen welcher Reihenfolge. Wenn Sie Namen verwenden, können Sie sie in beliebiger Reihenfolge einfügen.

Ausdrücke in Anführungszeichen

Sie müssen gelegentlich das Ergebnis eines Ausdrucks in einer Zeichenfolge in Anführungszeichen eingefügt werden soll. Auf diese Weise können Sie das Ergebnis in Ihrem Skript-Ausgabe enthalten. Eine Möglichkeit hierfür ist das Ergebnis in einer Variablen speichern. Dann verwenden Sie den Windows PowerShell-Trick Einfügen von Variablen in doppelten Anführungszeichen Zeichenfolgen. Windows PowerShell wird die Variable mit dem Inhalt ersetzen:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" $freepercent = $disk.freespace / $disk.size * 100 Write-Host "Free space on drive C: at $freepercent percent"

Windows PowerShell können Sie den vollständigen Ausdruck in Anführungszeichen setzen. Die Syntax ist ein Unix-Shell-Trick abgeleitet. Es sieht ein wenig seltsam, aber du wirst sehen, dass Leute, die es eine Menge zu verwenden:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" Write-Host "Free space on drive C: at $($disk.freespace / $disk.size * 100) percent"

Ich bevorzuge die erste Form, vor allem, weil ich neige dazu, meist mit Windows PowerShell-Anfänger arbeiten. Das erste Formular ist ein bisschen leichter zu lesen. Eine Sache passiert bei jedem Schritt des Skripts, so dass die Logik ein wenig leichter zu folgen.

Windows PowerShell verwendet genug Satzzeichen, dass die zweite Form verwirrender scheint. Die zweite Form ist jedoch auch technisch ein bisschen effizienter. Es ist keine Variable erstellen, die Windows PowerShell hat zu verfolgen. Dazu gehört auch ein kleines bisschen weniger eingeben, welche die meisten von ihnen scheinen mag.

Erstellen von Objekten

Die lange Form ist wieder praktisch, wenn ich brauche, um ein benutzerdefiniertes Objekt zu erstellen:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version $obj | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer $obj | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model Write-Output $obj

Manchmal werde ich Verknüpfung dies etwas mit dieser Technik, die die Befehle Add-Member in eine einzelne Rohrleitung kombiniert:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version –PassThru | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer –PassThru | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model –PassThru

Ich habe vor kurzem angefangen, Umstellung auf eine etwas andere Technik, die noch lesbar ist:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $props = @{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model} $obj = New-Object -TypeNamePSObject -Property $props Write-Output $obj

Wieder ist meine Vorliebe für diese Art der Langform Syntax wegen seiner Lesbarkeit. Ich arbeite hauptsächlich mit Windows PowerShell-Neulinge, so dass die Lesbarkeit ist entscheidend hilft ihnen zu verstehen, was geschieht. Sie sehen auch Leute diesen Trick verwenden:

$obj = Select-Object OSVersion,Mfgr,Model $obj.OSVersion = $os.version $obj.Mfgr = $cs.manufacturer $obj.Model = $cs.model $obj

Die Ergebnisse sind im Wesentlichen die gleichen, und dass letzte man verwendet ein bisschen weniger eingeben. Es ist Art von ein Hacker-Trick, um Select-Object auf diese Weise verwendet. Es ist die Tatsache nutzen, dass Sie, Select-Object sagen auf eine nicht vorhandene Eigenschaft auswählen. Es wird tatsächlich die Eigenschaft mit einem leeren Wert für die Ausgabeobjekt erstellt.

Es schmerzt mich zu sehen, Select-Object tatsächlich verwendet (oder, genauer gesagt, missbraucht) auf diese Weise, und ich bin nicht der einzige. So weit zurück wie 2008, einige meiner Kollegen Windows PowerShell MVPs waren gegen diese Verwendung aussprechen. Unabhängig davon, wie Sie über diese Technik fühlen sollten Sie lernen, es zu erkennen, so dass Sie wissen, was es tut.

In Windows PowerShell Version 3 werden Sie tatsächlich in der Lage, dies zu tun:

[pscustomobject]@{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model}

Ich habe nicht entschieden, wie ich über diese Syntax fühlen, aber im Allgemeinen ist es OK. Es ist noch ziemlich lesbar und beseitigt ein wenig Tipparbeit. Menschen beginnt verwenden es auch, so dass Sie es erkennen sollte für das, was es ist. Die letzte Technik scheint auch schneller ausführen (Lesen Sie mehr darüber auf Jonathan Medd Blog).

Objektverknüpfungen

Die letzte Verknüpfung-Technik sehen Sie oft ähnelt Ausdrücke in Zeichenfolgen. Das ist völlig legal Programmierung Syntax — es kann nur für Neulinge verwirrend sein. Dennoch gibt es nichts "falsch", so sollten Sie ankommen gewohnt an es sehen und wissen, was es tut.

Sagen Sie möchten Ausführen einer Methode eines Objekts, und führen dann etwas mit eine der Eigenschaften des resultierenden Objekts, etwa so:

$string = ' Hello ' $string = $string.Trim() $string.Length

Sie können all das Kontextmenü mithilfe von Klammern. Der in Klammern eingeschlossenen Ausdruck zuerst ausgewertet, und Windows PowerShell im Grunde die eingeklammerten durch ihr Ergebnis ersetzt:

$string = ' Hello ' ($string.Trim()).length

Es stapelt sich die Zeichensetzung viel, so es ein bisschen schwieriger für Ihr Gehirn ziehen die Stücke auseinander und bestimmen ist, was vor sich geht, aber es völlig legal ist. Es könnte sogar ein kleines bisschen schneller ausführen, da Windows PowerShell nicht die Variable so oft zu manipulieren.

Über All das Leid

In gewisser Hinsicht konnte nicht der unglückliche Windows PowerShell nur eine Möglichkeit, etwas zu tun bieten. Dann würden wir alle nur haben, zu erfahren, dass ein Weg. Wie es ist, haben wir eine Shell, die bietet viele verschiedene Syntaxvarianten für was im Wesentlichen die gleiche Aufgabe ist. Es lohnt sich, zumindest mit den vielen alternativen Syntax vertraut sein. Auf diese Weise können Sie alle Beispiele, die Sie verwenden auftreten.

Raymond Chen

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 so konzipiert, dass jeder Administrator mit Windows PowerShell wirksam zu helfen. Jones bietet öffentlichen und vor-Ort-Training an Windows PowerShell. Kontaktieren Sie ihn unter ConcentratedTech.com oder bit.ly/AskDon.

Verwandter Inhalt