derhoeppi
Goto Top

PowerShell Runspace Verständnisfrage

Guten Morgen,

nachdem wir im Thread PowerShell GUI WPF eine Lösung meines Problems gefunden haben, steht ich nun vor einem Verständnisproblem. Und zwar geht es weiterhin um eine WPF GUI. Diese besitzt eine Progressbar und einen Start-Button (so wie in vielen anderen Beispielen auch). Mein Skript ruft eine Funktion auf, die dann die Progressbar nach dem klicken des Start-Buttons füllt. Das funktioniert sowohl mit einem festen Wert als auch mit einer for-Schleife. Den Start-Button kann ich mehrmals ausführen, so dass sich der Wert verändert.
Nun möchte ich dieses Verhalten automatisieren und die Progressbar-Funktion aufrufen, wenn eine andere Funktion abgeschlossen ist. Wenn ich das jedoch mache, erhalte ich Fehlermeldungen, wie z.B.
Exception calling "AddScript" with "1" argument(s): "The state of the current PowerShell instance is not valid for this operation."

In meinem derzeitigen Skript verstehe ich nicht den Unterschied zwischen einem Button Klick und dem erneuten Aufruf einer Funktion. Den Runspace und die Hashtabelle vernichte ich nicht, so dass sie weiterhin existieren und ich diesen aus meiner Sicht mit Leben füllen kann. Vielleicht kann mir jemand auf die Sprünge helfen.

$script:i = 0

    $syncHash = [hashtable]::Synchronized(@{})
    $syncHash.Status = $PB_Status
    $syncHash.Status.Value = $PB_Status.Value
    $psCmd = [powershell]::Create()
    $newRunspace =[runspacefactory]::CreateRunspace()
    $newRunspace.ApartmentState = "STA"  
    $newRunspace.ThreadOptions = "ReuseThread"            
    $newRunspace.Open()
    $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)  

Function Statusbar{
    # create new runspace to run our sub-thread in
    $syncHash.Value = $syncHash.Status.Value + 10
 
    $psCmd.AddScript({ $syncHash.Status.Dispatcher.Invoke([action]{$syncHash.Status.Value=$syncHash.Value},"Normal") })  
    $psCmd.Runspace = $newRunspace
    #start the runspace
    $data = $psCmd.BeginInvoke()
    sleep -Seconds 5
}

Function Statusbar_Fortsetzung{
    $syncHash.Value = $syncHash.Status.Value + 10
    $syncHash.Status.Value=$syncHash.Value
    #$psCmd.AddScript({ $syncHash.Status.Dispatcher.Invoke([action]{$syncHash.Status.Value=$syncHash.Value},"Normal") }) 
    #$psCmd.Runspace = $newRunspace
    #$data = $psCmd.BeginInvoke()
}

Function Main{
    for ($k=0;$k -le 2;$k++){
          if ($script:i -eq 0){
                  Statusbar
                  sleep -Seconds 5
                 }
                else{
                       Statusbar_Fortsetzung
                       sleep -Seconds 5
                       }
    }
}

Update:
Ich habe eben mal ein paar Kontrollpunkte durch ein Write-Host eingerichtet. Ich sehe das mir die Hashtabelle mit Ihrem Inhalt Status (Progressbar) nur das Value 0 zurück liefert. Erst bei Abschluss wird die Progressbar optisch angepasst. Selbst wenn ich mein Skript so verändre, dass die Funktion Statusbar_Fortsetzung nur einen neuen Wert $syncHash.Value setzt und ich dann die Funktionen Statusbar und Statusbar_Fortsetzung mehrmal hintereinander aufrufe, erhalte ich den oben genannten Fehler zum AddScript. So langsam gehen mir die Ideen aus, was ich noch testen kann.

Gruß
derhoeppi

Content-Key: 286208

Url: https://administrator.de/contentid/286208

Printed on: April 27, 2024 at 07:04 o'clock