2010-11-30 48 views
7

一個腳本執行在一個循環中執行以下步驟監視作業的PowerShell會話,假設這兩個步驟需要很長的時間才能完成:從另一個PowerShell會話

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

第1步阻止腳本,第2步當然不會。 我可以通過控制檯輕鬆地監視循環的進度/狀態和步驟1。

我還想做的是在批處理仍在執行時監視第2步啓動的作業的作業狀態。

通常,可以從另一個會話「附加」或查詢另一個PowerShell會話? (假設監控會話不產卵工人會話)

+1

你是一個在你的例子中使用方法調用語法的壞男孩。 PowerShell函數不使用圓括號,並且在v2中的嚴格模式解析下出現分析錯誤(默認情況下,該函數未打開。) – x0n 2010-12-01 02:38:47

+0

@ x0n,nice catch!在我的辯護中,我最初調用.NET對象上的方法,但決定在示例中簡化(以正確性爲代價!)=) – Serguei 2010-12-01 02:44:45

+0

Np,我已在下面爲您解答。 – x0n 2010-12-01 02:57:37

回答

4

如果我關注你,那麼你不能在兩個不同的控制檯實例之間共享狀態。也就是說,這是不可能的,你想這樣做。但是,您不能從同一會話中監控工作。您可以使用事件從作業內的信號:

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

現在你有選擇,要麼使用Wait-Event [-SourceIdentifier Progress]Register-EngineEvent -SourceIdentifier Progress [-Action { ... }]或純老互動Get-Event從同一個會話(或在不同的機器看到和/或行爲上的進步如果您在遠程服務器上啓動作業)。

如果在本地計算機上完成所有工作,則完全可能不需要作業基礎結構。看看我的老博客帖子上RunspaceFactory和PowerShell對象進行一個初步的劇本「線程池」的實施:

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

希望這有助於

-Oisin

2

國家是容易監測:

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

如果您不需要檢索功能的任何輸出數據,那麼你可以寫信給像輸出所以:

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

如果你確實需要捕獲輸出,那麼你可以使用進度流,我認爲:

$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 } 
相關問題