2013-01-05 2 views
3

목록의 각 서버에 대해 작업을 실행합니다. 한 번에 5 개의 작업 만 실행하고 싶습니다. 작업이 완료되면 목록의 다음 서버에서 새 작업이 시작됩니다. 여기에 지금까지 무엇을, 그러나 나는 처음 5 작업을 실행 한 후 새 작업을 시작 얻을 수 없습니다PowerShell 작업 큐

$MaxJobs = 5 
    $list = Get-Content ".\list.csv" 
    $Queue = New-Object System.Collections.Queue 
    $CurrentJobQueue = Get-Job -State Running 
    $JobQueueCount = $CurrentJobQueue.count 

    ForEach($Item in $list) 
    { 
    Write-Host "Adding $Item to queue" 
    $Queue.Enqueue($Item) 
    } 

Function Global:Remote-Install 
{ 
$Server = $queue.Dequeue() 
$j = Start-Job -Name $Server -ScriptBlock{ 

     If($JobQueueCount -gt 0) 
     { 
     Test-Connection $Server -Count 15 
     }##EndIf 
    }##EndScriptBlock 

    } 

For($i = 0 ;$i -lt $MaxJobs; $i++) 
{ 
Remote-Install 
} 
+0

이것이 내가 끝낸 것입니다 ... 나는 이것이 나를 위해 잘 될 것이라고 생각합니다. .. $ list = Get-Content ". \ list.csv" $ queue = [System.Collections.Queue] :: 동기화 ((뉴 - 객체 System.Collections.Queue)) 를 ForEach ($ 목록에 $ 항목) { 쓰기 호스트 "큐에 $ 항목 추가" $ Queue.Enqueue ($ 항목) } $ server = $ queue.Dequeue() foreach ($ list in $ server) { $ running = Get-Job | 어디-오브젝트 {$ _ JobStateInfo.State -eq '실행'.} ($ running.Count -le 2) 경우 { .. 스크립트 여기 .. ​​ } 다른 { 실행 $를 | 대기업 } } –

답변

4

PowerShell을 당신이 Invoke-Command를 사용하는 경우이 작업을 수행 할 예 :

Invoke-Command -ComputerName $serverArray -ScriptBlock { .. script here ..} -ThrottleLimit 5 -AsJob 

BTW Start-Job이 다른 PowerShell 프로세스를 실행하여 작업을 실행하기 때문에 .NET 큐를 사용할 생각이 없습니다.

+0

주셔서 감사합니다. Invoke-Command는 다른 컴퓨터에서 명령을 호출하기를 원합니다. –

+1

Invoke-Command는 로컬에서도 작동합니다. –

3

모듈 SplitPipeline의 cmdlet Split-Pipeline을 살펴볼 수 있습니다. 같은 코드가 보일 것이다 :

Import-Module SplitPipeline 
$MaxJobs = 5 
$list = Get-Content ".\list.csv" 
$list | Split-Pipeline -Count $MaxJobs -Load 1,1 {process{ 
    # process an item from $list represented by $_ 
    ... 
}} 

-Count $MaxJobs 병렬 작업의 수를 제한합니다. -Load 1,1은 각 작업에 정확히 1 개의 항목을 파이프 에게 알려줍니다.

이 방법의 장점은 코드 자체 동기 를 호출하고 모두가 순차적으로 호출 된 것처럼 (심지어 출력 순서는 스위치 Order으로 보존 할 수 있음) 작업 결과를 출력한다.

그러나이 방법은 remoting을 사용하지 않습니다. 이 코드는 여러 개의 실행 영역에서 현재 PowerShell 세션에서 작동합니다.