2010-11-30 3 views
7

Un script exécute les étapes suivantes dans une boucle, on suppose les deux étapes prennent beaucoup de temps pour terminer:Surveillance des travaux dans une session PowerShell d'une autre session PowerShell

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

L'étape 1 bloque le script et l'étape 2, bien sûr. Je peux facilement surveiller la progression/l'état de la boucle et l'étape 1 à travers la console.

Ce que je voudrais également faire est de surveiller l'état du travail des travaux démarrés par l'étape 2 pendant que le lot est encore en cours d'exécution.

En général, il est possible de 'joindre' ou d'interroger une autre session PowerShell à partir d'une autre session? (En supposant que la session de surveillance ne se reproduit pas la session de travail)

+1

Vous est un mauvais garçon utilisant la syntaxe d'appel de méthode dans votre exemple. Les fonctions PowerShell n'utilisent pas de parenthèses et sont une erreur d'analyse dans l'analyse syntaxique en mode strict dans v2 (qui n'est pas activée par défaut). – x0n

+0

@ x0n, nice catch! Pour ma défense, j'appelais à l'origine les méthodes sur les objets .NET mais j'ai décidé de simplifier dans l'exemple (au prix de la correction!) =) – Serguei

+0

Np, et j'ai répondu ci-dessous pour vous. – x0n

Répondre

4

Si je vous suis, vous ne pouvez pas partager l'état entre deux instances de console différentes. C'est-à-dire que ce n'est pas possible de la façon dont vous voulez le faire. Cependant, il n'est pas vrai que vous ne pouvez pas surveiller un travail depuis la même session. Vous pouvez signaler des événements à partir du travail:

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 
    } 
} 

Maintenant, vous avez le choix d'utiliser soit Wait-Event [-SourceIdentifier Progress], Register-EngineEvent -SourceIdentifier Progress [-Action { ... }] ou vieux Get-Event interactif simple pour voir et/ou agir sur les progrès de la même session (ou une autre machine si vous avez démarré le travail sur un serveur distant.)

Il est également tout à fait possible que vous n'ayez pas besoin de l'infrastructure Jobs si tout le travail est effectué sur la machine locale. Jetez un oeil à un ancien poste de blog de mine sur les objets RunspaceFactory et PowerShell pour une mise en œuvre du script "threadpool" rudimentaire:

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

Hope this helps,

-Oisin

+0

Merci de me rappeler que je dois lire votre message. Toujours dans la file d'attente 'à lire', augmentera la priorité :) – stej

2

Etat est facile à surveiller:

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

Si vous n'avez pas besoin de récupérer toutes les données de sortie de la fonction, vous pouvez écrire à la sortie comme si:

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

Si vous avez besoin de capturer la sortie, vous pouvez utiliser le flux de progrès que je pense:

$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

Oui, mais le point crucial de ma question est de savoir comment remplir la variable $ job d'une autre session PowerShell. (par exemple une autre fenêtre PowerShell) Je ne peux pas surveiller l'état de la même session car il est bloqué par l'exécution de {$ x = DoSomeWork();} à partir de l'itération suivante. – Serguei

Questions connexes