2010-11-30 6 views
7

Ein Skript die folgenden Schritte in einer Schleife ausgeführt wird, übernehmen nehmen beiden Schritte eine lange Zeit in Anspruch:Jobs in einer Powershell-Sitzung aus einer anderen Sitzung Powershell-Überwachung

  1. $x = DoSomeWork;
  2. Start-Job -Name "Process $x" { DoSomeMoreWork $x; };

Schritt 1 blockiert das Skript und Schritt 2 natürlich nicht. Ich kann den Fortschritt/Status der Schleife und Schritt 1 durch die Konsole leicht überwachen.

Ich möchte auch den Auftragsstatus von Jobs überwachen, die mit Schritt 2 gestartet wurden, während der Stapel noch ausgeführt wird.

Im Allgemeinen ist es möglich, eine andere Powershell-Sitzung von einer anderen Sitzung aus anzuhängen oder abzufragen. (Die Überwachungssitzung Unter der Annahme, laichen nicht die Arbeiter Sitzung)

+1

Sie ist ein böser Junge, der in diesem Beispiel Methodenaufrufsyntax verwendet. PowerShell-Funktionen verwenden keine Klammern und sind ein Parsing-Fehler im strikten Mode-Parsing in v2 (das standardmäßig nicht aktiviert ist.) – x0n

+0

@ x0n, netter Fang! Zu meiner Verteidigung habe ich ursprünglich die Methoden auf .NET-Objekten aufgerufen, aber im Beispiel (im Interesse der Korrektheit!) Zu vereinfachen beschlossen) =) – Serguei

+0

Np, und ich habe unten für Sie beantwortet. – x0n

Antwort

4

Wenn ich Ihnen folge, können Sie den Status nicht zwischen zwei verschiedenen Konsoleninstanzen freigeben. Das heißt, es ist nicht möglich, so wie Sie es wollen. Es ist jedoch nicht wahr, dass Sie einen Auftrag nicht in derselben Sitzung überwachen können. Sie können aus dem Job mit Ereignissen signalisieren:

Start-Job -Name "bgsignal" -ScriptBlock { 

    # forward events named "progress" back to job owner 
    # this even works across machines ;-) 
    Register-EngineEvent -SourceIdentifier Progress -Forward 

    $percent = 0 
    while ($percent -lt 100) { 
     $percent += 10 

     # raise a new progress event, redirecting to $null to prevent 
     # it ending up in the job's output stream 
     New-Event -SourceIdentifier Progress -MessageData $percent > $null 

     # wait 5 seconds 
     sleep -Seconds 5 
    } 
} 

Jetzt haben Sie die Wahl, entweder Wait-Event [-SourceIdentifier Progress] zu verwenden, Register-EngineEvent -SourceIdentifier Progress [-Action { ... }] oder plain old interaktive Get-Event zu sehen und/oder Handlung über die Fortschritte aus der gleichen Sitzung (oder einer anderen Maschine Wenn Sie den Job auf einem Remote-Server gestartet haben.)

Es ist auch völlig möglich, dass Sie die Jobs-Infrastruktur nicht benötigen, wenn alle Arbeiten auf dem lokalen Computer ausgeführt werden. Werfen Sie einen Blick auf ein altes Blog-Post von mir auf der RunspaceFactory und Powershell-Objekte für ein rudimentäres Skript „Threadpool“ Umsetzung:

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

hoffe, das hilft,

-Oisin

+0

Danke, dass du mich daran erinnerst, dass ich deinen Beitrag lesen muss. Noch in 'zu lesen' Warteschlange, erhöht Priorität :) – stej

2

Staat ist einfach zu überwachen:

$job = Start-Job -Name "Process $x" { DoSomeMoreWork $x } 
$job.state 

Wenn Sie keine Ausgabedaten von der Funktion abrufen müssen, dann können Sie die Ausgabe schreiben wie so:

$job = Start-Job {$i=0; while (1) { "Step $i"; $i++; Start-Sleep -sec 1 }} 
while ($job.State -eq 'Running') 
{ 
    Receive-Job $job.id 
} 

Wenn Sie die Ausgabe erfassen müssen, dann könnte man den Fortschritt Strom verwenden denke ich:

$job = Start-Job {$i=0; while (1) { 
        Write-Progress Activity "Step $i"; $i++; Start-Sleep -sec 1 }} 
while ($job.State -eq 'Running') { 
    $progress=$job.ChildJobs[0].progress; 
    $progress | %{$_.StatusDescription}; 
    $progress.Clear(); Start-Sleep 1 } 
+1

Ja, aber der Kern meiner Frage ist, wie Sie die $ Job-Variable aus einer anderen Powershell-Sitzung erhalten? (z. B. ein anderes Powershell-Fenster) Ich kann den Status nicht von derselben Sitzung aus überwachen, da er durch die Ausführung von {$ x = DoSomeWork();} von der nächsten Iteration blockiert wird. – Serguei

Verwandte Themen