2017-02-07 3 views
2

In einem Powershell-Skript habe ichKönnen in PowerShell 2 Funktionen gleichzeitig ausgeführt werden?

function f1{ do something} 
function f2{ do something else} 
button1 
button2 
richtextbox 

Wenn ich button1 drücken es läuft f1 und es gibt Daten im richtextbox. Wenn ich drücke, muss das Skript f2 ausgeführt werden, auch wenn f1 nicht beendet ist. Die Daten von f2 Ich brauche es nicht in der gleichen richtextbox ausgegeben werden, kann es ein anderer sein. Meine Frage ist: Können in PowerShell 2 verschiedene Funktionen gleichzeitig ausgeführt werden?

Update: Für mein PowerShell-Skript habe ich eine GUI, die eine Reihe von Schaltflächen hat, die verschiedene Dinge tun. Wenn ich einen Knopf drücke, beginnt es sich mit einem seriellen Gerät zu verbinden und gibt Daten an die Richtextbox aus und an einigen Punkten speichert es Daten in einer Textdatei. 2 weitere Tasten haben folgende Funktionen: Sie übernehmen Teile der Daten aus der gespeicherten Textdatei, öffnen einen temporären PHP-Webserver, öffnen einen Link zum Erstellen einer PDF-Datei und senden die Datei zum Drucken an den richtigen Drucker/Tray . Diese 2 Tasten habe ich gerade bemerkt, dass sie funktionieren. Mein Problem ist mit den Schaltflächen, die in einem Popup-Formular sind. Eine andere Schaltfläche aus meinem Hauptformular öffnet ein Popup-Formular und füllt es mit Daten aus der oben gespeicherten Textdatei.

$print_equip_button.Add_Click({ 
    print "link.php?data=$data" $file_location $type 
}.GetNewClosure()) 

In der Hauptform funktioniert der obige Code, von Popup es nicht. Auch ohne Glück versucht.

$print_equip_button.Add_Click({ 
    Start-Job -ScriptBlock {print "link.php?data=$data" $file_location $type} 
}.GetNewClosure()) 

Ich habe am Anfang einer Funktion hinzugefügt

for($i=1;$i -le 100;$i++){ 
    [System.Windows.Forms.Application]::DoEvents() 
    start-sleep -s 1 
    $LogTextBox.Text = "$temp`n" + "Count $i" 
} 

um zu sehen, ob das, was f1 funktioniert passiert, wenn ich eine Taste im Popup drücken und aus dem, was ich sehe, wenn ich öffne Das Popup-Formular, das Zählen stoppt und fährt fort, wenn ich es schließe.

UPDATE: Ich habe festgestellt, dass, wenn ich das Skript in PowerShell ISE geöffnet und es von dort ausführen, funktioniert alles wie ich wollte ohne die Notwendigkeit von "Start-Job". Beim Ausführen der .ps-Datei allein funktioniert es nicht, nicht einmal mit "Start-Job"

+0

Werfen Sie einen Blick auf [Jobs] (https://msdn.microsoft.com/en-us/powershell/reference/4.0/microsoft .powershell.core/about/about_jobs). – Richard

+0

Mit 'Start-Job -ScriptBlock {Funktion} ohne Glück versucht – xlucian

Antwort

0

Beide Jobs und Runspaces werden dies für Sie tun, erinnern Sie sich, obwohl Sie die Informationen speziell aus dem abrufen müssen Funktion, führen Sie es nur in einem anderen Thread wird nicht eine Rückkehr geben, da die Ausgabe in einem separaten Thread sein wird.

Jobs sind besser für eine einzelne Funktion, die eine lange Zeit benötigt, z. B. die Bereitstellung einer ovf und Runspaces sind besser für umfassendere Funktionen, zum Beispiel ping 1000 Maschinen parallel.

Sie können receive-job verwenden, um Ergebnisse vom Start-Job zurückzuholen.

0

Sie können dies durch die asynchrone ui updation mit Runspaces:

$button1_Click={ 

$ps = [powershell]::create() 
$ps.AddScript(
    { 
    #replace with your function definition 
     while($true){ 
     $richtextbox1.appendtext("1") 
     start-sleep 1 
     } 
    } 
) 

$ps.Runspace.SessionStateProxy.SetVariable("richtextbox1", $richtextbox1) 
$ps.BeginInvoke() 
} 


$button2_Click={ 
$ps2 = [powershell]::create() 
$ps2.AddScript(
    { 
     #replace with your function definition 
     while($true){ 
     $richtextbox2.appendtext("1") 
     start-sleep 1 
     } 
    } 
) 


$ps2.Runspace.SessionStateProxy.SetVariable("richtextbox2", $richtextbox2) 
$ps2.BeginInvoke() 


    } 
Verwandte Themen