2012-06-16 24 views
1

我試圖用作業均PowerShell中運行的併發實例,讓我的腳本可以更快地完成。我打電話的腳本都是獨立的,不需要互斥等。問題是它會調用50個腳本中的5個,然後停止。其餘的腳本似乎永遠不會運行。等待工作有什麼問題?也由於某種原因實際運行五個腳本似乎讓我得到雙重輸出要執行兩次......並非所有我的PowerShell v2的工作得到運行

$Invocation = (Get-Variable MyInvocation -Scope 1).Value 
$ScriptDir = Split-Path $Invocation.MyCommand 
$ScriptDir -match '(?<content>.*\d)' | out-null 
$MainDir = $matches['content'] 
$ScriptName = $MyInvocation.MyCommand.Name 
$Items = Get-ChildItem -Path $MainDir | Where-Object {$_.mode -match "d"} 

$jobMax = 4 
$jobs = @() 

$jobWork = { 
    param ($MyInput,$dir) 
    $command = "$dir\" + $MyInput.name + "\" + $MyInput.name + ".ps1" 
    Start-Process powershell.exe -argumentlist $command -WindowStyle Hidden #-wait 
} 

foreach ($Item in $Items) { 
    if ($jobs.Count -le $jobMax) { 
     $jobs += Start-Job -ScriptBlock $jobWork -ArgumentList $Item,$MainDir 
    } else { 
     $jobs | Wait-Job -Any 
    } 
} 
$jobs | Wait-Job 

編輯:此外,由於我使用的啓動過程PowerShell中的所有腳本同時運行(除非我啓用 - 等待),而不需要開始工作。我想用工作,這樣我就可以加油了。也許這是錯誤的邏輯,我有一份工作開始一個新的PowerShell實例?

EDIT2:我認爲這是錯誤的使用開始作業開始poweshell的新實例。在打開新的PowerShell實例後完成這項工作,實際的腳本內容與作業的開始和結束無關。這裏是我的固定腳本:)

$Invocation = (Get-Variable MyInvocation -Scope 1).Value 
$ScriptDir = Split-Path $Invocation.MyCommand 
$ScriptDir -match '(?<content>.*\d)' | out-null 
$MainDir = $matches['content'] 
$ScriptName = $MyInvocation.MyCommand.Name 
$Items = Get-ChildItem -Path $MainDir | Where-Object {$_.mode -match "d"} 

$maxJobs = 4 
$jobs = @() 

foreach ($Item in $Items) { 
    $command = "$MainDir\" + $Item.name + "\" + $Item.name + ".ps1" 
    $jobs += Start-Job -filepath $command -ArgumentList $MainDir,$Item 
    $running = @($jobs | ? {$_.State -eq 'Running'}) 

    while ($running.Count -ge $maxJobs) { 
     $finished = Wait-Job -Job $jobs -Any 
     $running = @($jobs | ? {$_.State -eq 'Running'}) 
    }  
} 
Wait-Job -Job $jobs > $null 

我不得不編輯所有我的腳本,以便我可以傳遞參數作爲參數,但現在一切工作正常。這個線程是有益的Running multiple scriptblocks at the same time with Start-Job (instead of looping)

回答

0

我的猜測是,(看你的代碼後),你將只能得到第4頁的作業開始。 工作(甚至完成)不會自動消失。您需要在完成後清理它們(也許是Receive-Job的第一個)。如果你不這樣做 - PowerShell中會旋轉$ jobsMax工作,一旦完成 - 我會很驚訝地看到任何其他的「新人」。

添加一些接收/刪除作業邏輯,它應該更好地工作。

另外:據我可以告訴你正在運行的腳本,所以我會建議使用在powershell.exe而不是-command - 文件參數。

HTH Bartek

+0

感謝您的回覆。看我的編輯。接收/刪除作業似乎不是問題。但是關於-file參數的最後一個註釋更接近了一點,並幫助我朝着解決此問題的正確方向前進。謝謝。 – kokotas

相關問題