Runspaces debuggen

Seit der PowerShell 5.0 ist es möglich, Skripts zu debuggen, die in einem zusätzlich angelegten Runspace ausführen. Doch warum sollte man das tun? Zum Beispiel, weil ein Skript in einem asynchron, also per BeginInvoke ausgeführten Runspace parallel zu anderen Runspaces ausführen kann und sich damit eine effektive Form des „Multitaskings“ bei der Ausführung eines Skripts ergibt.

Runspaces gab es bei der PowerShell von Anfang an, denn ein Runspace spielt eine zentrale Rolle für die Ausführung von Befehlen. Jeder Befehl wird in einem Runspace ausgeführt. In der Regel ist es jener Default-Namespace, der automatisch mit dem Start der Host-Anwwendung angelegt wird. Über ein [RunspaceFactory]::CreateRunspace() werden weitere Runspaces angelegt. Anschließend wird eine Pipeline [PowerShell]::Create() angelegt, mit Befehlen oder einem Skript gefüllt und mit einem Runspace verbunden.

Erst seit der Version 5.0 ist es möglich, ein Skript in einem separaten Runspace zu debuggen. Im Mittelpunkt stehen die Cmdlets Enter-PSHostProcess, Get-Runspace und Debug-Runspace.

Das folgende Beispiel geht von einem kleinen Skript aus mit dem Namen Skript.ps1. Sein Inhalt spielt keine Rolle. Wichtig ist nur, dass es in einem separaten Runspace (synchron) ausgeführt wird. Dies geschieht in einem Skript, das in der PowerShell ISE ausgeführt wird.

Damit das Skript bei seiner Ausführung nicht einfach durchrauscht, wird in der Zeile mit dem Invoke-Aufruf ein Haltepunkt gesetzt und das Skript gestartet. Dadurch wird ein Runspace angelegt, ein Skript in den Runspace geladen, aber noch nicht ausgeführt.

Ein Skript wird in einem weiteren Runspace ausgeführt

Im zweiten Schritt wird die PowerShell-Konsole gestartet und der ISE-Prozess per Enter-PSHostProcess betreten:

Der Prompt der Konsole ändert sich zu [Prozess: 1234], wobei 1234 für die Prozess-ID steht.

Ein Get-Runspace listet alle Runspaces im ISE-Prozess auf. Wichtig ist der „RunspaceX“-Runspace und seine Id. Seine State-Eigenschaft muss den Wert „Opened“ und seine Avaivalibilty-Eigenschaft den Wert „Available“ besitzen.

Im Konsolenhost werden die Runspaces des ISE-Prozesses aufgelistet

Dieser Runspace wird per Debug-Runspace-Cmdlet mit der Id des Runspaces debuggt:

Neben dem Standard-Runspace steht auch der Runspace „RunspaceX“ zur Auswahl

Damit wird der Runspace in den Debug-Modus versetzt. Damit auch etwas passiert, muss der Invoke-Aufruf in der ISE ausgeführt werden. Damit steht der Debugger in der PowerShell-Konsole zur Verfügung und das Skript kann bei der Ausführung in seinem Runspace debuggt werden. Die einzige Einschränkung besteht darin, dass die Ausgaben gesammelt und erst am Ende zusammen ausgegeben werden.

Der Debugger wird über [Strg]+[C], der Host-Prozess über exit verlassen.

Der Runspace „RunspaceX“ wird debuggt

Die Möglichkeit jeden Runspace debuggen zu können ist eine wichtige Neuerung bei der Version 5.0, auch wenn sie nur weniger Anwender verwenden werden.

Jetzt muss ich noch herausbekommen wie ich ein Skript debuggen kann, das in einer von mir umgesetzten Host-Anwendung in einem Remote-Runspace ausgeführt wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden .