cherezoff - stock.adobe.com

Erhöhen Sie Ihre Skripteffizienz mit PowerShell Start-Job

Mit PowerShell können Sie komplexere Aufgaben zeitsparend automatisieren – aber nur, wenn das Skript nicht die Konsole blockiert. PowerShell Start-Job löst dieses Problem.

Die Arbeit mit PowerShell kann geradezu schmerzhaft langsam sein. Aus diesem Grund entwickeln viele Administratoren erweiterte Skripte, die komplexe Aufgaben bewältigen.

Obwohl Automatisierungsskripte in der Regel schnell durchlaufen, gibt es gelegentlich Situationen, in denen ein Skript eine beträchtliche Zeit in Anspruch nimmt. Auf den Bildschirm zu starren, während Sie auf PowerShell warten, ist nicht die effizienteste Zeitnutzung. Um dieses Problem zu beheben, sind PowerShell-Jobs eine wertvolle Möglichkeit, mehrere Skripts parallel auszuführen, so dass die Konsole von einem langsameren Skript nicht blockiert wird.

Wie kann Job-Parallelisierung helfen? Hier ein Beispiel: wir haben ein Skript, das mehr als eine Stunde benötigt, um Daten abzurufen, und an ihnen mehrere komplexe Handlungen durchzuführen, zu denen es eine Reihe verschiedener Infrastrukturkomponenten braucht. PowerShell-Jobs können die Zeit, die das Skript benötigt, halbieren und unterdessen steht die PowerShell-Konsole für andere Aufgaben zur Verfügung.

Was ist ein PowerShell-Hintergrundjob?

Das Cmdlet Start-Job startet einen Hintergrundauftrag für die aktuelle PowerShell-Sitzung und führt den Code asynchron aus. Das Skript läuft, doch Sie können PowerShell weiterhin verwenden, um andere Aufgaben zu erledigen. Das eignet sich besonders für Arbeiten, die keine Benutzereingabe erfordern, oder für automatisierte Aufgaben, die einem festen Zeitplan folgen.

PowerShell weist dem Hintergrundjob eine ID zu. Sie können die ID verwenden, um den aktuellen Status des Jobs zu überprüfen und Ergebnisse aus allen vom Code erfassten Daten zu erhalten.

Wie müssen Sie die Skripte für PowerShell-Jobs anpassen?

Sie müssen Ihren PowerShell-Code erst konvertieren, damit Sie ihn im Hintergrund laufen lassen können. Dabei müssen Sie beachten, dass ein PowerShell-Job nicht interaktiv sein kann – das heißt, er muss ohne weitere Eingaben durchlaufen können.

Wenn ein PowerShell-Job ausgeführt wird, gibt es keine native Fehlerberichterstattung; das Skript bricht automatisch ab, wenn Probleme auftreten. Daher muss Ihr Code sorgfältig geprüft und getestet werden, um ein sicheres Ausführen zu gewährleisten.

Eine Möglichkeit, ein Skript für die Hintergrundausführung vorzubereiten ist es, Details oder Prüfpunkte an wichtigen Teilen des Skripts in eine Textdatei zu exportieren. Dadurch wird die Aktivität des Skripts bei einem auftretenden Problem automatisch zur Fehlerbehebung überprüft. Das kann so einfach sein wie das Exportieren eines nützlichen Hinweises wie Vorverarbeitung abgeschlossen oder API-Abfrage abgeschlossen und das Aufzeichnen der Variablen. Die Komplexität hängt vom erforderlichen Informationsniveau ab.

So arbeiten Sie mit PowerShell-Jobs

Es gibt drei wichtige Cmdlets zum Verwalten Jobs in PowerShell: Start-Job, Get-Job und Stop-Job. Einen Job auszuführen ist ganz einfach:

Start-Job -ScriptBlock {}

Das PowerShell-System führt den Code im Parameter ScriptBlock aus. Ein einfaches Beispiel ist:

Start-Job -ScriptBlock { Get-Content c:\mybigdatafile.txt }

Abbildung 1: Dieser PowerShell-Job sammelt .
Abbildung 1: Dieser PowerShell-Job sammelt .

Sie können auch, wenn Sie wir in unserem Beispiel vorgehen, in PowerShell direkt ein Skript im Hintergrund ausführen lassen:

Start-Job -FilePath c:\code\myscript.ps1

Das Skript wird ausgeführt, kann jedoch keine Eingaben von der Konsole akzeptieren.

Wenn Sie mehrere Jobs im Hintergrund ausführen, können Sie den Status dieser Jobs mit dem Cmdlet Get-Job überprüfen.

Wie der Name schon sagt, zeigt Get-Job die laufenden Jobs und deren Status an. Auch wenn Sie mehrere Jobs einreichen, sind diese nicht sequentiell, da jeder Start-Job einen untergeordneten Prozess erstellt, um die Arbeit zu erledigen.

Die Ausgabe des Befehls Get-Job zeigt den Skriptstatus an. Dies ist von unschätzbarem Wert, wenn Sie den Status eines im Hintergrund ausgeführten Skripts kennen müssen.

Manchmal kann ein Job schief gehen oder muss gestoppt werden. Das Cmdlet Stop-Job hält ein Skript im folgenden Format an:

Stop-Job <JOB ID>

Für zusätzliche Details zur Arbeit mit diesen Cmdlets bietet die integrierte Hilfe von PowerShell mit dem Befehl Get-Help eine Fülle von Dokumentationen und Befehlsbeispielen.

Abbildung 2: Sammeln Sie Informationen zum PowerShell-Job mit dem Get-Job-Cmdlet.
Abbildung 2: Sammeln Sie Informationen zum PowerShell-Job mit dem Get-Job-Cmdlet.

Probieren Sie diese Strategien aus, um Ihren Code zu überarbeiten

Wie entwickelt man Code für die parallele Verarbeitung? Stellen Sie zunächst sicher, dass der Code keine Interaktion erfordert. Sie können das Skript schreiben, um Daten zu sammeln, und dann die Jobs mit dem Cmdlet Start-Job ausführen.

Alle erforderlichen Eingaben müssen im Voraus mit Variablen oder wie auch immer Sie die Daten erfassen, bereitgestellt werden, zum Beispiel mit einem API-Aufruf, der Anmeldeinformationen für den Zugriff benötigt.

Zerlegen Sie den Code in Funktionen. Das erleichtert die Verwaltung und Integration in Jobs. Eine Möglichkeit, die Jobausgabe zu erhalten, besteht darin, die Transkriptionsfunktion zu verwenden. Sie können damit die Ausgabe des Skripts aufzeichnen, ohne eigene Berichte erstellen zu müssen.

Hintergrundjobs in PowerShell machen die Arbeit mit dem Tool wesentlich effizienter. Es ist ein geringer Nachteil, dass der Code autark sein muss. Doch es lohnt sich, zu verstehen, wie Sie Ihren Skripten diese Flexibilität hinzufügen können. Das Auftragsverwaltungssystem funktioniert auf den meisten Plattformen, mit denen PowerShell kompatibel ist, zum Beispiel Linux und macOS sowie Windows.

Erfahren Sie mehr über Desktop-Management