2017-02-28 54 views
1

$vcconnect有50臺機器,我需要在所有50臺機器上運行這個工作,但是當我運行它時,它會崩潰shell。暫停腳本,直到條件爲真powershell

我想在某個時間點將並行執行限制爲10。

我試過了一段時間,但我錯過了一次,因爲它在同一時間執行了所有50個操作並崩潰了我的外殼。

foreach($vci in $vcconnect){ 
    [array]$jobstart += Start-Job -Name top2 -ArgumentList @($vci, $cred, $from, $to) -ScriptBlock $importcode 
} 
+0

感謝鑲嵌黑克勒爲指向正確的。 – SUN

+0

重新打開此問題。工作流不是並行作業的最佳解決方案,也不提供明確限制併發運行作業數量的工具 –

回答

1

如果要並行運行的腳本,並控制併發運行實例的最大數量,使用RunspacePool

# Create a RunspacePool, of maximum 10 concurrently running runspaces 
$RSPool = [runspacefactory]::CreateRunspacePool(1,10) 
$RSPool.Open() 

# Start a new "job" for each server 
$Jobs = foreach($vci in $vconnect){ 
    $PS = [PowerShell]::Create().AddScript($importcode) 
    $PS.RunspacePool = $RSPool 
    $vci, $cred, $from, $to |ForEach-Object { 
     [void]$PS.AddArgument($_) 
    } 
    New-Object psobject -Property @{ 
     Shell = $PS 
     ComputerName = $vci 
     ResultHandle = $PS.BeginInvoke() 
    } 
} 

# Wait for the "jobs" to finish 
do{ 
    Start-Sleep -Milliseconds 500 
} while ($Jobs |Where-Object IsCompleted -eq $false) 

# Collect results, suppress (but warn on) errors 
$Results = foreach($Job in $Jobs){ 
    $Job.Shell.EndInvoke($Job.ResultHandle) 
    if($Job.Shell.HadErrors){ 
     Write-Warning "$($Job.ComputerName) had $($Job.Shell.Streams.Error.Count) errors:" 
     $Job.Shell.Streams.Error |Write-Warning 
    } 
} 
+1

對於等待位而不是「Do/While」循環,您可以使用'[System.Threading.WaitHandle] ::爲WaitAll($ Job.ResultHandle.AsyncWaitHandle)' – TheMadTechnician

相關問題