News Ticker

Powershell 5: Verwenden von Methoden bei einem Befehl mittels der Pipline

Powershell-Pipelines Powershell ist ja eine objektorientierte Scriptsprache. Die Grundidee der Objektorientierung besteht in der Verwendung von Variablen(Objekten die in der Lage sind verschiedene Daten zu speichern. Sie sollen aber zusätzlich die Fähigkeit haben Methoden (Befehle) auszuführen. Wenn man jetzt aber mit einem Objekt arbeiten möchte muss man erst heraus finden welche Methoden dieses Objekt zur Verfügung stellt. Das könnt ihr entweder über die Dokumentation des jeweiligen Objekts heraus finden oder über das Cmdlet Get-Member.
Um dieses Cmdlet aber bei einem Objekt richtig an zu wenden benötigt man eine sogenannt Pipline.  Diese ist dafür da um ein Ergebnis von einem Befehl zu einer Weiterverarbeitung an einen anderen Befehl zu schicken. So eine Pipline wird einfach mit so einem | gekennzeichnet. Wenn wir uns jetzt z.B. von dem Befehl Get-Process anzeigen lassen möchten welche Methoden er zur Verfügung stellt können wir das mit diesem Befehl machen.

Get-Process | Get-Member

Wenn wir das eingegeben haben bekommen wir eine Liste mit allen Methoden und Eigenschaften welche uns der Befehl Get-Prozess bereit stellt.

Ich denke an Hand von einem Beispiel kann man die Funktionsweise der Pipline am besten erkennen. Stellen wir uns als Aufgabe das wir ein Script entwickeln sollen welches die Logdateien auf einem System löscht welche älter sind als 30 Tage. Jetzt denkt man zunächst das ist doch gar nicht schwer ich ziehe einfach überall die Zahl 30 von dem Aktuellen Datum. Aber wenn man jetzt die Monatsgrenze überschreitet würde es zu Problemen kommen. Wie gehen wir jetzt also am besten vor?

Zunächst kennen wir ja den Befehl Get-Date mit welchem wir uns das Aktuelle Datum ausgeben können, das ist ja schon einmal etwas jetzt benötigen wir “nur” noch eine Funktion mit welcher wir von dem Aktuellen Datum die 30 Tage abziehen können. Wir lassen uns einfach einmal alle Methoden aufzeigen welche uns der Befehl Get-Date liefert, das können wir ja mit diesem Befehl machen wie wir oben gesehen haben.

Get-Date | Get-Member

Jetzt sehen wir das dort folgende Methode angeboten wird.
AddDays              Method         System.DateTime AddDays(double value)
Das ist ja eigentlich genau das war wir brauchen nur wir möchten ja keine Tage dazu zählen sondern abziehen. Aber das können wir ja ganz einfach beheben indem wir bei der Anzahl der Tage ein Minus davor setzten.

Mit dieser Methode haben wir jetzt alles was wir zum Lösen dieser Aufgabe benötigen. Nur wie rufen wir jetzt diese Methode auf?
Zunächst speichern wir einfach einmal das aktuelle Datum in einer Variablen.

$tag = Get-Date

Anschließend müssen wir bei der Variablen Tag die Methode AddDays anwenden, das sieht dann Folgendermaßen aus:

$tag = $tag.AddDays(-30)

Wir rufen wieder die Variable $tag auf und wenden darauf die Methode AddDays an mit der Zahl –30 und ziehen damit 30 Tage vom Aktuellen Datum ab. Das Ergebnis speichern wir dann wieder in der Variablen Tag.
Jetzt müssen wir uns nur noch das Ergebnis ausgeben lassen, das Funktioniert wie ich in einem der vorherigen Tutorials bereits beschrieben hatte ja einfach indem man nur den Variablennamen eingibt.

$tag

Jetzt können wir noch prüfen ob wir das richtige Ergebnis heraus bekommen haben. Ich habe das ganze heute am 16.02.2010 ausgeführt und als Ergebnis bekam ich den 17.01.2010. Das ist auch richtig so denn der Januar hatte ja 31 Tage und daher kommt man dann auf den 17. Januar als Ergebnis.

Wenn es noch Fragen zu der Verwendung mit den Piplines gibt stellt diese einfach in den Kommentaren.

Hier geht es zu den bisherigen Teilen der Artikelserie Powershell:
Powershell 1: Einführung in die Shell von Microsoft
Powershell 2: PowerGUI Entwicklungsumgebung für die Powershell
Powershell 3: Variablen erstellen und mit diesen Rechnen
Powershell 4: Prozesse anzeigen und Dateien filtern

4 Kommentare zu Powershell 5: Verwenden von Methoden bei einem Befehl mittels der Pipline

  1. Chris // 18. Feb 2010 um 00:30 //

    Danke fuer den Artikel. 🙂

    Konnte es noch nicht ausprobieren. Aber wuerde auch sowas gehen:

    $tag = $tag.AddDays-30

    oder brauch man die Klammer unbedingt?

    Und was mich noch interessieren wuerde. Kannst du ein Beispiel nennen, wo man eine in der Shell eine Datei ausgibt un den Inhalt nach bestimmten Kriterien filtern kann? Das duerfte ja vielleicht auch mit der Pipe gehen.

  2. Nein ohne die Klammer ist es nicht möglich diese wird bei dem Befehl gebraucht.

    Zu deiner 2. Frage hier de Befehl dazu
    Get-content c:\test.txt | where-object {$_ -eq „test“ -or $_ -eq „hallo“}
    Mit dem Get Content ließt man den Inhalt der Textdatei ein und mit where-object prüft man dann jede Zeile ab wo das entsprechende Kriterium zutrifft. Noch eine kleine Erklärung der Klammer, mit dem $_ gibt man an das man sich auf das aktuelle Pipline Objekt bezieht. Das -eq steht für gleich und dann das „test“ steht dafür das man danach filtern möchte mit dem -or kann man einfach weitere Vergleichsoperatoren hinzufügen.

  3. Chris // 18. Feb 2010 um 18:49 //

    Danke fuer die Erklaerung. 🙂

    Das ist echt eine lange Zeile, aber ich werde das mal testen. Das kann schon ganz nuetzlich sein.

  4. Stoffi // 10. Nov 2012 um 03:13 //

    Wow, danke für die Erklärung!
    Jetzt verstehe ich erst was es mit diesen $var.zeugs(123) zu tun hat.

    Mittels herumprobieren habe ich herausgefunden dass dein Beispiel auch so geht:
    (get-date).AddDays(-30)

Kommentare sind deaktiviert.