Was ist PowerShell?

PowerShell ist ein Cross-Plattform Werkzeug / Framework, das zur Automatisierung und Konfiguration dient. Mittlerweile befindet es sich in der siebten Version und wird ständig weiterentwickelt. Eine Unterstützung für alle Plattformen gab es aber nicht von Anfang an, vielmehr musste sich PowerShell erst einmal in der Welt der Shells durchsetzen.

Durch das Auftreten von grafischen Benutzeroberflächen, wurden Funktionen vor der Shell verborgen. Dem sollte PowerShell entgegenwirken.

Ziel war die einfache Bedienung für Administratoren als auch Nicht-Programmierern. Ihnen sollte es ermöglicht werden, Einstellungen und Befehle mit nur wenig Vorwissen in der Materie ausführen zu können.

 

DATENTYPEN

PowerShell besitzt eine Vielzahl an Datentypen oder auch „Type Accelerators“ wie sie genannt wurden.

Type Accelatoren

Sie entstehen als Produkt eines Entwicklers, der sich vor einer langen Zeichenkette an Objekten befindet, die er nicht jedes Mal bei der Typisierung abschreiben will. Wie der Name „Accelerator“ schon deutet, soll es die Typisierung einer Variablen beschleunigen.

Nachfolgend zwei Beispiele zur Veranschaulichung:

  1. System.Int32 -> Int
  2. System.String -> String

Das Typisieren einer Variablen läuft im Normalfall wie folgt ab:

[string]$tmp

Ohne die „Type Accelerators“ würde man es wie folgt im Quellcode schreiben müssen:

[System.String]$tmp

Int, String, bool, …

Int:

       Int16 [short] / uInt16 [ushort]

       Int32 [int] / uInt32      [uint]

       Int64 [long] / uInt64 [ulong]

Floating:

  • Binary: [single]/ [float], [double]
  • Decimal: [decimal]

Char:

       Kann einen UTF-16-enkodierten 16-Bit Unicode Code Point speichern

String:

       Kann 0 oder mehr UTF-16-enkodierte 16-Bit Unicode Code Points speichern

Array,  List

Ein Array kann null oder mehrere Elemente tragen. Die Elemente können jeden möglichen Datentyp besitzen. Es besitzt eine limitierte Größe, die entweder selbst definiert oder durch die Anzahl der vorher deklarierten Elemente festgelegt werden kann. Einem Array kann nach der Initialisierung und Deklarierung kein weiteres Element mehr hinzugefügt werden, sollte es die maximale Länge schon vorher erreicht haben!

Ein Array kann wie folgt initialisiert werden:

$arr = New-Object int[] 5

oder

$arr = [int[]]::new(5)

Erlaubter Datentyp

Maximale Länge

Wie auch in vielen anderen Programmiersprachen beginnt ein Array mit dem Index 0.

Ein Element oder mehrere Elemente in einem Array können mithilfe der folgenden Syntax abgefragt werden:

$arr[0]       -> Ein Element, in diesem Fall

$arr[0..2]   -> Elemente von Index 0 bis 2

Möchte man diesem Array trotzdem einen neuen Eintrag hinzufügen, muss man sich mit „+=“ behelfen. Das fügt dem Array nicht einfach einen neuen Index hinzu, sondern es erstellt ein komplett neues Array mit der Länge des alten Arrays plus (in dem Fall) 1.

Ein Test zeigte, dass das Hinzufügen von Hello zu einem mit zwei Items gefülltem Array insgesamt 6,1 Millisekunden gedauert hat. Das hört sich zunächst einmal ziemlich „schnell“ an, jedoch zeigt der Vergleich mit einer ArrayList das Gegenteil. Hier dauerte dieselbe Operation nur 3,5 Millisekunden. Das Ganze geschieht mithilfe der Add-Methode der Liste

Eine List hat Ähnlichkeiten mit einem Array, nur hat dieses eine „unlimitierte“ Größe. Es können beliebig Einträge mit der „Add“-Methode ergänzt werden. Intern arbeitet die ArrayList mit einem dynamischem Array.

Hashtables

Hashtables sind (zumindest von mir) häufig verwendete Informationsträger. In den von mir geschriebenen Skripten, Modulen und Config-Dateien findet man sie zu Haufe wieder. Ein Hashtable-Objekt lässt sich mit einem Array vergleichen, nur jeder Wert, der darin gespeichert wird, hat einen Schlüssel zugewiesen. Man muss neue Einträge immer mit dem sogenannten „Key-Value-Pair“ angeben. Es soll vor allem zum einfachen Wiederfinden von Datensätzen dienen.

Nachfolgend ein Bespiel eines Hashtables

$hashName = @{

       „id“ = 3

       „name“ = „Hammon“

       „vorname“ = „Nico“

}

Nun gibt es insgesamt zwei Möglichkeiten die Schlüsselnamenseigenschaftswerte anzuzeigen. Aber zuerst eine Erklärung was dieser ^ Begriff bedeutet.
Ein Schlüssel ist eine Eigenschaft eines Hashtables. Jeder Schlüssel hat einen Wert, auf den er verweist. Dementsprechend kann man durch ihn den Wert der Eigenschaft aufrufen.
Da ein Hashtable ein „erweitertes Objekt“ ist, kann man die Eigenschaftswerte wie folgt herausfinden:

$hashName.

Dabei ist die erfragte Eigenschaft. Man erhält nun den Wert, der durch den Schlüssel verwiesen wird. In dem oben beschriebenen Hashtable gibt es aktuell keine Schlüssel, die Leerzeichen in ihrem Namen tragen. Sollte dies aber der Fall sein, was ich persönlich jedoch vermeide, können diese nicht mit der beschriebenen Punkt-Notation angesprochen werden (Leerzeichen werden nicht unterstützt).

$leerHash = @{

       „ssh Schlüssel“ = „df4a54dfa6b465asb“

}

Möchten wir hier den Wert der Eigenschaft „ssh Schlüssel“ abfragen, müssen wir das wie folgt tun:

$leerHash[„ssh Schlüssel“]                  ($leerHash[])

 

Hier noch einmal zusammengefasst:

Für Keys ohne Leerzeichen

$hash. 

und mit Leerzeichen

$hash[]

 

Methoden

Es gibt nun einige Methoden um ein initialisiertes Hashtable zu editieren.

  1. .Add()
  2. .Set_Item()
  3. .Remove()
  4. .GetEnumerator()
  5. .ContainsKey() /Value()

.Add() ermöglicht es eine weitere Eigenschaft, die nicht denselben Namen wie die bereits vorhandenen Schlüssel hat, anzulegen.
Dafür muss man die Methode wie folgt nutzen:

$hash.Add(, )                        -> $hash.Add(string, any)

.Set_Item() ermöglicht es einen Eigenschaftswert nachträglich abzuändern.
Dafür muss man die Methode wie folgt nutzen:

$hash.Set_Item(, )          -> $hash.Set_Item(string, any)

Alternativ

$hash[] =      
– kann auch zum Hinzufügen genutzt werden

.Remove() ermöglicht es eine Eigenschaft zu löschen, sofern sie nicht schreibgeschützt ist und es sich um keine Standardeigenschaft handelt.
Dafür muss man die Methode wie folgt nutzen:

$hash.Remove()                                 -> $hash.Remove(string)

 

.GetEnumerator() gibt im Grunde die selbe Ausgabe zurück, die auch der einfache $hash-Befehl (Variable ausgeben) liefern würde. Jedoch muss diese Methode verwendet werden, möchte man das Ergebnis durch eine Pipe weiterverwenden. Es wird eine Collection aus DictionaryEntrys übergeben. Das CmdLet, an das gepiped wurde, muss das unterstützen.
Dafür muss man die Methode wie folgt nutzen:

$hash.GetEnumerator()

 

.ContainsKey()/ Value() prüft ob der übergebene String als Schlüssel in dem Hashtable wiedergefunden werden kann.

$hash.ContainsKey()

$hash.ContainsValue()  

 

Eine weitere schöne Funktionalität ist der SPLAT-Operator (@). Hat man ein Hashtable in der folgenden Weise initialisiert:

$hash = @{path = „C:\tmp“; Recurse = $true}

So kann man dieses HashTable an eine Funktion als Parametersatz übergeben.

dir @stuff -> dir -Path C:\tmp -Recurse:$true