Zum Hauptinhalt springen

Statische Eigenschaften und Methoden

Objektmethoden können nur mit den Objekten verwendet werden, zui denen sie gehören. Nehmen Sie als Beispiel einen String. Die Stringmethode Split() teilt einen String in Substrings auf.

$Env:PSModulePath.Split(';')

> C:\Users\Admin\Documents\WindowsPowerShell\Modules 
> C:\Program Files\WindowsPowerShell\Modules 
> C:\Windows\system32\WindowsPowerShell\v1.0\Modules

Split() verarbeitet den Inhalt des Strings, der in der Umgebungsvariablen $Env:PSModulePath gespeichert ist, kann aber ausschließlich auf die String-Instanz von $Env:PSModulePath angewendet werden – es ist nicht möglich, mit $Env:PSModulePath.Split() einen anderen String zu bearbeiten als den, der in $Env:PSModulePath gespeichert ist.

Oder nehmen Sie einen Datumstyp:

$Datum = Get-Date
$Datum.AddHours(10)

Die Methode AddHours() des Objekts $Datum kann immer nur Stunden zu dem DateTime addieren, dass in $Datum gespeichert ist.

Es gibt aber auch .NET-Methoden, die beliebige Objekte verarbeiten können. Da in der Objektorientierten Programmierung alles in Klassen verpackt werden muss, werden solche universellen Methoden in Klassen gespeichert und als statische Methoden bezeichnet. Anders gesagt sind statische Methoden Programme, die in Objektortientierten Sprachen wie c# aber immer in einer Klasse gespeichert werden. Zusätzlich zu statischen Methoden gibt es auch statische Eigenschaften. Statische Eigenschaften werden oft dazu verwendet, um Konstante Werte zur Verfügung zu stellen.

Einige sehr praktische Beispiele befinden sich in der [System.Math]-Klasse:

[System.math]::Pi               # die Zahl Pi
> 3,14159265358979
[System.math]::Round(10.22456)  # Runden
> 10
[System.math]::SQRT(441)        # Quadratwurzel (Square-root)
> 21

Die Math-Klasse stellt eine ganze Reihe von mathematischen Methoden und zwei Konstanten (Pi und die Eulersche Zahl e) (im Powershell 7 zusätzlich tau) zur Verfügung. Im Gegensatz zu Objekten kann man die Methoden verwenden, um beliebige Werte zu berechnen. Um Powershell zu sagen, dass man auf Methoden in der Klasse zugreifen möchte, nicht auf die Methoden der Klasse, wird die etwas eigenwillige Syntax :: verwendet. 

Der Zugriff auf statische Eigenschaften und Methoden findet mit zwei Doppelpunkten statt, weil jede einzelne Klassen ebenfalls als Objekte repräsentiert ist. Mit einem Punkt greift man auf die Meta-Informationen der jeweiligen Klasse zu. Wenn Sie z.B. wissen wollen, in welcher Datei der Code für die Math-Klasse versteckt ist, können Sie die Eigenschaft Assembly von [System.math] abfragen:

[System.math].assembly

> GAC   Version     Location
> ---   -------     --------
> True  v4.0.30319  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorl...

Um alle statischen Methoden eines Typs anzuzeigen, können Sie Get-Member mit dem Parameter static verwenden:

[System.math] | get-member -Static

>   TypeName: System.Math

> Name   MemberType   Definition
> ----   ----------   ----------
> Abs    Method       static sbyte Abs(sbyte value), static int16 Abs(int16 value), static... 
> Acos   Method       static double Acos(double d)
> Asin   Method       static double Asin(double d)
> Atan   Method       static double Atan(double d)
[…]

 

Hilfreiche statische Methoden

Hier noch ein paar Beispiele für hilfreiche statische Methoden

Umgebungsvariablen global setzen mit System.Environment

Wenn Sie in Powershell Umgebungsvariablen setzen wollen, können Sie das über das Powershell-Laufwerk ENV: machen. Alle Änderungen, die an diesem Laufwerk durchgeführt werden, beziehen sich aber nur auf den Powershell-Prozess und sind nach dem Schließen der Powershell wieder verschwunden. Mit der statischen Methode SetEnvironmentVariable() aus der System.Environment-Klasse können die Umgebungsvariablen aber auch Systemweit gesetzt werden:

[System.Environment]::SetEnvironmentVariable('Test','Computervariable','Machine') 
[System.Environment]::SetEnvironmentVariable('Demo','Uservariable','User')

Der erste Aufruf erstellt eine Umgebungsvariable "Test" mit dem Inhalt "Computervariable" auf Computerebene, also für alle Benutzer, während der zweite Aufruf eine Benutzervariable mit dem Namen "Demo" und dem Inhalt "Uservariable" erzeugt.

Da sich statische Methoden bis auf die beiden Doppelpunkte beim Aufruf wie Methoden verhalten, kön-nen Sie sich die Überladungen durch Aufrufen der Methode ohne die runden Klammern anzeigen lassen:

[system.Environment]::SetEnvironmentvariable

> OverloadDefinitions
-----------------------
> static void SetEnvironmentVariable(string variable, string value) 
> static void SetEnvironmentVariable(string variable, string value, System.EnvironmentVariableTarget target)

Die Klasse System.Environment hat aber noch mehr spannende Eigenschaften und Methoden:

[system.Environment] | get-member -Static

>  TypeName: System.Environment

> Name                       MemberType Definition
> ----                       ---------- ----------
> ExpandEnvironmentVariables Method     static string expandEnvironmentVariables(string name)
> GetEnvironmentVariables    Method     static System.Collections.IDictionary
> GetLogicalDrives           Method     static string[] GetLogicalDrives()
> SetEnvironmentVariable     Method     static void SetEnvironmentVariable(string variable, strin...
> CommandLine                Property   static string CommandLine {get;}
> CurrentDirectory           Property   static string CurrentDirectory {get;set;}
> CurrentManagedThreadId     Property   static int CurrentManagedThreadId {get;}
[...]

 (Die Ausgabe wurde zusammengefasst)

Daten konvertieren mit System.Convert

Die Convert-Klasse stellt eine Reihe von Methoden zur Verfügung, um Datentypen zu konvertieren.

[System.Convert]::ToSTring(42562,16)   # Konvertiert ins Hex-System
> a642
[System.Convert]::ToSTring(42562,2)    # Konvertiert ins Binär-System
> 1010011001000010
[System.Convert]::ToSTring(42562,8)    # Konvertiert ins Oktal-System
> 123102 

Das erste Beispiel konvertiert die Zahl 42562 ins Hexadezimal (16er)-Zahlensystem, das zweite Beispiel konvertiert ins Binär-System (2er), und das dritte Beispiel konvertiert ins Oktal-System (8er).

Textbasierte Übertragungsprotkolle wieSMTP, das Mail-Protokoll, können keine Binärdaten übertragen, weil manche der Bitfolgen in Binärdaten in Textdaten als Steuerzeichen interpretiert werden. Um zu verstehen, warum das problematisch ist, brauchen Sie nur eine ausführe Datei im Notepad aufzumachen. Das Problem ist letzlich, dass man Binärdaten nicht als Text darstellen und hinterher wieder fehlerfrei in Binärdaten zurück konvertierten kann. Um dieses Problem zu lösen, hat man das Base64-Format entwickelt, bei dem die Bits einer Binärdatei in ausschließlich darstellbare Zeichen kodiert werden. Die darstellbaren Zeichen können dann problemlos übertragen und beim Empfänger zurück kodiert werden. Für die Konvertierung in Base64 gibt es ebenfalls eine Methode in der Convert-Klasse. 

$img = $env:windir\Web\Wallpaper\Windows\img0.jpg

$Bin=[System.Convert]::ToBase64String((Get-Content -Path $Img -Raw -Encoding Byte))

Mit der Methode FromBase64String() wandeln Sie den String wieder in Binärcode um, und mit Set-Content können Sie die Binärdaten wieder als Datei speichern:

$Binary = [Convert]::FromBase64String( $Bin )
Set-Content -Path c.\image.jpg -Value $Binary -Encoding Byte
[System.Convert]::ToSTring(42562,16)   # Konvertiert ins Hex-System
a642
[System.Convert]::ToSTring(42562,2)    # Konvertiert ins Binär-System
1010011001000010
[System.Convert]::ToSTring(42562,8)    # Konvertiert ins Oktal-System
123102