Windows PowerShell Die Kraft der Variablen

Don Jones

Wenn Sie mit einer Windows-basierten Skriptsprache arbeiten, wie z. B. VBScript oder KiXtart, sind Sie an Variablen als nichts Anderes gewöhnt, als eine Art Speichermechanismus für Daten. Windows PowerShell verfügt auch über Variablen, diese sind jedoch erheblich leistungsfähiger als die Variablen in älteren Skriptsprachen. Die Windows

PowerShell-Variablen sind zugrunde liegenden Klassen im Microsoft® .NET Framework zugeordnet. Und im Framework stellen Variablen Objekte dar, was bedeutet, dass sie Daten speichern und auch auf vielfache Weise manipulieren können. Die widerstandsfähigen Funktionen der Variablen in Windows PowerShell™ sind der Grund, weshalb die Windows PowerShell-Skriptsprache keine spezifischen Datenbearbeitungsfunktionen enthält. Für diese Funktionen besteht kein Bedarf, da die Variablen bereits selbst die Funktionalität bereitstellen.

Deklarieren von Variablen

Obwohl das New-Variable cmdlet in Windows PowerShell Ihnen ermöglicht, eine Variable zu deklarieren und ihr einen anfänglichen Wert zuzuweisen, müssen Sie das cmdlet nicht verwenden. Stattdessen können Sie eine neue Variable einfach und schnell durch Zuweisen eines Werts erstellen:

$var = "Hello"

In Windows PowerShell beginnen Variablennamen immer mit einem Dollarzeichen($) und können eine Mischung aus Buchstaben, Zahlen, Symbolen oder sogar Leerzeichen enthalten (wenn Sie allerdings Leerzeichen verwenden, müssen Sie die Variable in geschweiften Klammern, wie z. B. ${Meine Variable} = „Hallo“ einschließen). In diesem Beispiel wurde eine neue Variable mit dem Namen $var erstellt und ihr wurde der anfängliche Wert „Hallo“ zugewiesen. Weil in diesem Fall der Wert eine Zeichenfolge ist, wird Windows PowerShell den Zeichenfolgendatentyp verwenden, um den Wert zu speichern. Im Kontext von .NET Framework ist das die System.String-Klasse, die möglicherweise über die am besten integrierte Funktionalität von allen Variablentypen verfügt. Wenn, sagen wir, eine Kleinbuchstabenversion des Werts in $var erscheinen soll, kann ich folgendermaßen vorgehen:

PS C:\> $var.ToLower()
hello
PS C:\>

Die ToLower-Methode ist in die System.String-Klasse integriert und stellt eine Kleinbuchstabendarstellung des Werts der Zeichenfolge her. Sie ändert jedoch nicht den eigentlichen Inhalt der Variablen $var. Um eine vollständige Liste der Funktionen der System.String-Klasse anzuzeigen, leiten Sie eine Zeichenfolgenvariable folgendermaßen zum Get-Member cmdlet:

$var | get-member

Abbildung 1 zeigt die Ausgabe, die einige Dutzend Methoden umfasst, die zum Manipulieren von Zeichenfolgen verwendet werden. Beinahe die gesamte Funktionalität, die von VBScript-Funktionen der Zeichenfolgenmanipulation bereitgestellt wird, wird stattdessen von Methoden der Zeichenfolgenvariablen in Windows PowerShell bereitgestellt.

Abbildung 1 Ein Blick auf die Ausgabe der System.String-Klasse

Abbildung 1 Ein Blick auf die Ausgabe der System.String-Klasse(Klicken Sie zum Vergrößern auf das Bild)

Viele der Funktionen der Zeichenfolgenvariablen sind in einem administrativen Kontext nützlicher als die Zeichenfolgenfunktionen in einer Sprache wie VBScript. Angenommen, Sie haben ein Skript geschrieben, das UNC-Pfade (Universal Naming Convention) aus einer Datei einliest und diese dann für einen bestimmten Zweck verwendet. Sie müssten überprüfen, ob jeder eingelesene Pfad eine UNC ist, bevor Sie versuchen, den Pfad zu verwenden. Die StartsWith-Methode lässt Sie bestätigen, dass der Wert einer Zeichenfolge mit den notwendigen umgekehrten Schrägstrichen, die eine UNC erfordert, beginnt:

PS C:\> $path = "\\Server\Share"
PS C:\> $path.StartsWith("\\")
True
PS C:\>

Weil StartsWith einen Wert als Wahr oder Falsch wiedergibt, können Sie es in logischen Konstrukten verwenden:

if ($path.StartsWith("\\")) {
 # code goes here
}

Windows PowerShell bietet sogar eine Form der automatischen Vervollständigung für die Methoden von Variablen, was die Menge der erforderlichen Tastatureingaben verringert. Wenn $var eine Zeichenfolge enthält, können Sie

$var. 

eingeben und dann auf Tab drücken, das den ersten Methodennamen für die Variable $var auftauchen lässt. Erneutes Drücken von Tab verschiebt zur nächsten Methode, und Drücken von Umschalt + Tab bringt die frühere Methode zum Vorschein. Auf diese Weise können Sie durch alle verfügbaren Methoden blättern, bis Sie die gewünschte finden.

Variablenverwirrung

So weit haben die Beispiele Windows PowerShell ermöglicht, den Datentyp der Variablen zu bestimmen. Die Zuweisung einer Zeichenfolge zu einer Variablen zwingt die Variable, zur System.String-Klasse zu gehören. Die Zuweisung einer Zahl zu einer Variablen führt andererseits gewöhnlich dazu, dass die Variable eine ganze Zahl wird (oder genauer gesagt ein Int32, der einen bestimmten Wertbereich speichern kann). Bedenken Sie z. B. Folgendes:

PS C:\> $int = 5
PS C:\> $int | get-member

  TypeName: System.Int32

Diese verstümmelte Datenausgabe zeigt, dass Windows PowerShell $int als einen Int32 behandelt, der seinen eigenen Satz an Methoden und Eigenschaften hat. Und sein Satz an Methoden und Eigenschaften ist in der Tat viel kleiner als der des Zeichenfolgentyps.

$int wurde zum Int32 gemacht, weil der Wert nicht in Anführungszeichen eingeschlossen war, und weil der Wert ausschließlich aus Ziffern bestand. Wäre er in Anführungszeichen eingeschlossen gewesen, wäre er als ein System.String interpretiert worden.

Windows PowerShell entscheiden zu lassen, welcher Datentyp zu verwenden ist, bringt nicht immer die Ergebnisse, die Sie wünschen. Angenommen, Sie lesen Werte aus einer Datei, und Sie wollen, dass die Werte immer als Zeichenfolgen behandelt werden. Vielleicht aber enthalten einige der Werte nur Ziffern, was die Möglichkeit erhöht, dass Windows PowerShell sie als Int32 oder einen anderen numerischen Typ behandeln würde. Das kann Probleme für Ihr Skript verursachen. Wenn Windows PowerShell den Wert nicht als eine Zeichenfolge erkennt, dann sind alle Methoden der System.String-Klasse nicht verfügbar (und Ihr Skript könnte auf eine dieser nicht verfügbaren Methoden angewiesen sein).

Um dieses Problem zu umgehen, können Sie Windows PowerShell zwingen, eine Variable als einen bestimmten Typ zu behandeln, indem Sie diesen Typ deklarieren, wenn Sie die Variable zum ersten Mal verwenden. Hier ist ein Beispiel:

[string]$var = 5

Normalerweise wäre $var ein Int32 gewesen, aber hier wurde Windows PowerShell gezwungen, $var zu einer Zeichenfolge zu machen, und damit sichergestellt, dass alle Methoden verwenden werden können, die der System.String-Klasse zugeordnet werden. Die Deklaration des Variablentyps liefert dem Code auch eine praktische Art von Selbstdokumentation, da es jetzt offensichtlich ist, welcher Datentyp erwartungsgemäß in $var passt. Eigentlich habe ich es mir angewöhnt, immer einen bestimmten Typ für alle meine Variablen zu deklarieren, und so Windows PowerShell die Entscheidung völlig abzunehmen. Dies macht das Verhalten meiner Skripts voraussagbarer und in mehreren Fällen hat es mir ziemlich viel Debuggingzeit erspart.

Wie Sie sich denken können, hat das gewaltsame Deklarieren von Variablen seine Rückwirkungen, obwohl diese nicht unbedingt schlecht sind. Nehmen Sie dieses Beispiel, das den Variablentyp nicht deklariert:

PS C:\> $me = 5
PS C:\> $me = "Don"

Die Variable $me war anfänglich ein Int32, aber Windows PowerShell hat sie in eine Zeichenfolge umgewandelt, als der Wert „Don“ hinzugefügt wurde. Windows PowerShell kann den Typ einer Variablen nach Bedarf ändern, vorausgesetzt, dass die Variable nicht bereits explizit auf einen bestimmten Typ festgelegt wurde.

In diesem Beispiel habe ich $me gezwungen, ein Int32 zu sein, indem ich den [int]-Typnamen verwendet habe:

PS C:\> [int]$me = 5
PS C:\> $me = "Don"
Cannot convert value "Don" to type 
"System.Int32". Error: "Input string 
was not in a correct format."
At line:1 char:4
+ $me <<<< = "Don"

Als ich dann versuchte, der Variablen einen Zeichenfolgenwert zuzuweisen, wurde eine Fehlermeldung angezeigt. Da ich $me explizit gezwungen hatte, ein Int32 zu sein, hat Windows PowerShell erwartet, die Zeichenfolge „Don“ in einen Ganzzahlwert zu konvertieren. Es war nicht fähig, dies durchzuführen, noch war es fähig, den Typ von $me in String zu ändern.

So viele Typen

Viele Typen sind innerhalb Windows PowerShell verfügbar. Eigentlich können Sie jeden beliebigen .NET Framework-Typ verwenden (und die verfügbaren Typen gehen in die Hunderte). Jedoch definiert Windows PowerShell mehrere Verknüpfungen für gebräuchliche Datentypen. Abbildung 2 ist nur eine partielle Liste, die 10 der gebräuchlichsten Typenverknüpfungen zeigt. Eine vollständige Liste finden Sie in der Windows PowerShell-Dokumentation.

Figure 2 Gebräuchliche Typenverknüpfungen

Verknüpfung Datentyp
[datetime] Datum oder Zeit
[string] Zeichenfolge
[char] Einzelnes Zeichen
[double] Gleitzahl mit doppelter Genauigkeit
[single] Gleitzahl mit einfacher Genauigkeit
[int] 32-Bit ganze Zahl
[wmi] Windows Management Instrumentation (WMI) Instanz oder Sammlung
[adsi] Active Directory-Dienstobjekt
[wmiclass] WMI-Klasse
[Boolesch] Wahrer oder Falscher Wert

Sie können einen Variablentyp auch dadurch deklarieren, dass Sie den vollen .NET Framework-Klassennamen verwenden, wie hier:

[System.Int32]$int = 5

Dieses Verfahren ermöglicht Ihnen, Typen zu verwenden, die sich im .NET Framework befinden, aber keine bestimmte Verknüpfung in Windows PowerShell haben.

Erweitern von Typen

Vielleicht das Tollste an Windows PowerShell ist seine Möglichkeit, die Funktionen dieser veränderlichen Typen zu erweitern. Im Windows PowerShell Installationsordner (normalerweise in %systemroot\system32\windowspowershell\v1.0, obwohl Sie den Pfad auf 64-Bitsystemen etwas anders vorfinden werden) finden Sie eine Datei mit dem Namen types.ps1xml. Sie können diese Datei in Notepad oder in einem XML-Editor, wie z. B. PrimalScript bearbeiten. Standardmäßig ist die System.String-Klasse nicht aufgelistet, aber viele andere Typen doch. Dem System.String-Typ kann jedoch eine neue Funktion hinzugefügt werden, indem diese der types.ps1xml-Datei hinzugefügt wird.

Nach der Änderung muss Windows PowerShell geschlossen und wieder geöffnet werden. Außerdem muss sichergestellt sein, dass die lokale Skriptausführungsrichtlinie nicht signierten Skripts die Ausführung ermöglicht, da ich types.ps1xml: nicht signiert habe.

Set-executionpolicy remotesigned

Jetzt, nach dem Neustart von Windows PowerShell, kann die neue Funktionalität wie folgt verwendet werden:

PS C:\> [string]$comp = "localhost"
PS C:\> $comp.canping
True
PS C:\>

Wie Sie sehen, habe ich der System.String-Klasse eine CanPing-Eigenschaft hinzugefügt. Dies gibt Wahr oder Falsch an, um anzuzeigen, ob der lokale Computer die Adresse pingen kann, die in der Zeichenfolge enthalten ist. In Abbildung 3 sehen Sie, dass die WMI-Abfrage eine besondere Variable, nämlich $this, verwendet. Die Variable $this vertritt den aktuellen Wert, der in der Zeichenfolge enthalten ist, und wie der Inhalt der Zeichenfolgenvariable in die WMI-Abfrage übergeben wird.

Figure 3 Erweitern des System.String-Typs

<Type>
  <Name>System.String</Name>
  <Members>
    <ScriptProperty>
      <Name>CanPing</Name>
      <GetScriptBlock>
      $wmi = get-wmiobject -query "SELECT *
FROM Win32_PingStatus WHERE Address = '$this'"
      if ($wmi.StatusCode -eq 0) {
        $true
      } else {
        $false
      }
      </GetScriptBlock>
    </ScriptProperty>
  </Members>
</Type>

Lassen Sie eine Variable die Arbeit machen

Windows PowerShell liefert flexible Variablentypen voller Features und ein gleichermaßen flexibles System zum Erweitern der Funktionalität der Typen. Diese Funktionen machen es sehr leicht, ganz viel Leistung in Ihre Skripts einzubauen. Tatsächlich können Variable zu einem bedeutenden Baustein in komplizierten Skripts werden, wobei sie in vielen Fällen die erweiterten Funktionen übernehmen, die normalerweise in einer komplizierteren Funktion zu finden wären.

Online weiterlernen

Seien auch Sie bei dieser Serie von Webcasts dabei: Am zweiten Dienstag jeden Monats tauchen wir tiefer in die reiche Skriptfunktionalität ein, die von Windows PowerShell bereitgestellt wird. Besuchen Sie microsoft.com/events/series/donjonesscripting.mspx und melden Sie sich noch heute an.

Am 20. Februar 2007 Windows PowerShell: Der Skripting-Intensivkurs

Nehmen Sie an diesem Webcast teil, und lernen Sie die Variablen, Sprachenkonstrukte, Skripts und Funktionen in Windows PowerShell kennen. In diesem einstündigen Intensivkurs führen wir vor, wie die einfache aber wirksame Skriptsprache in Windows PowerShell die administrative Automatisierung von Windows® schneller macht. Wir erforschen auch mehrere Drittanbietertools, die Windows PowerShell-Skripting so schmerzlos wie möglich machen.

Am 20. März 2007 Windows PowerShell: Funktionen, Filter und Wirkungsgrad

Lernen Sie, wirksamen, modularisierten Code in Windows PowerShell-Funktionen und Filtern zu erstellen. Wir erforschen die widerstandsfähigen Bereichsregeln in Windows PowerShell, die Ihnen ermöglichen, Funktionen und Filter völlig einzukapseln, und erklären, wie Sie diese Funktionen und Filter über Projekte hinweg leicht wieder verwenden können. Wir führen auch vor, wie Sie Ihre eigenen benutzerdefinierten Funktionen in den globalen Bereich in Windows PowerShell einfügen können, was es einfacher macht, eine Bibliothek nützlicher Dienstprogrammfunktionen zu Ihrer direkten Verfügung zu assemblieren.

Am 17. April 2007 Windows PowerShell und Windows Management Instrumentation

Windows PowerShell kann auf die komplette Leistungsfähigkeit und die Funktionalität von Windows Management Instrumentation oder WMI zugreifen. Es wird nicht nur beschrieben, wie Windows PowerShell zu verwenden ist, um auf WMI zuzugreifen, sondern auch wie WMI-Objekte und -Sammlungen durch die Windows PowerShell-Pipeline übermittelt werden. Es wird erkundet, wie WMI-Eigenschaften und -Methoden in Windows PowerShell-Skripts zu verwenden sind, und die zugrunde liegenden Sicherheits- und Konfigurationsfeatures in WMI werden illustriert.

Am 22. Mai 2007 Windows PowerShell: Konvertieren von VBScript

Sie möchten Ihre Skripts—oder einfach nur Ihre Fähigkeiten—von VBScript zu Windows PowerShell konvertieren? Dann nehmen Sie an diesem Webcast teil, um zu lernen, wie es geht. Es wird erkundet, wie Windows PowerShell alle Hauptkonstrukte und Features von VBScript integriert, was es leicht macht, Ihre VBScript-Fähigkeiten in diese neue administrative Umgebung zu übersetzen. Es wird illustriert, wie Tools in VBScript in die systemeigene Skriptsprache in Windows PowerShell konvertiert werden. Es wird außerdem die einmalige Struktur in Windows PowerShell untersucht und Ihnen demonstriert, wie Sie in die Verwendung der Windows PowerShell Skriptsprache einsteigen, damit Ihre Bemühungen effizienter und wirksamer werden.

Am 19. Juni 2007 Windows PowerShell: Interne Erweiterungen

In diesem Webcast wird erkundet, wie Windows PowerShell das leistungsfähige und flexible .NET Framework verwendet, um Daten zu behandeln, und Ihnen Hunderte von eingebauten Funktionen zum Verwalten von Zeichenfolgen, Daten und anderen Datentypen zur Verfügung stellt. Aber haben Sie auch gewusst, dass Sie diese Funktionen mithilfe von Windows PowerShell-Skripts erweitern können? Wir zeigen Ihnen, wie Zeichenfolgenvariable erstellt werden, die nicht nur einen Computernamen enthalten, sondern Ihnen auch mitteilen können, ob dieser Computer läuft. Erfahren Sie, wie Datums- und Zeitvariablen erstellt werden, die automatisch ihre Daten ohne die Verwendung externer Funktionen formatieren können. Nehmen Sie an dieser Sitzung teil, um zu sehen, wie alle Arten neuer Funktionalität in Minutenschnelle in Windows PowerShell eingebaut werden können, und somit die Windows-Verwaltung schneller und leichter machen.

Don Jones ist Direktor für Projekte und Dienste bei SAPIEN Technologies und Mitautor von Windows PowerShell: TFM (SAPIEN Presse). Sie erreichen Don Jones unter www.ScriptingAnswers.com.

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.