2014-12-08 67 views
0

我有一個腳本,用於檢查不同服務器上的某些服務是否啓動,如果不啓動,腳本應啓動該服務。並行啓動服務

問題是,它不會並行啓動服務,而是等到每個服務啓動。

代碼:

$server_list = Get-Content -path D:\Path\list_of_servers.txt 

$server_list | foreach { 
(Get-Service -Name '*Service Name*' -computername $_) | Where-Object {$_.status -eq "Stopped"} | Set-Service -Status Running 
} 

我知道這是由於腳本編寫方式,但也許有些你有什麼建議,如何使它更好?

乾杯!

+1

哪個版本Powershell你在跑嗎?有了V3和V4,你可以使用'foreach -parallel' – 2014-12-08 07:55:39

+0

你用'Start-Job'看了嗎? – xXhRQ8sD2L7Z 2014-12-08 07:58:35

+0

@MickyBalladelli不幸的是,我們正在使用V2 – user3782265 2014-12-08 08:29:40

回答

4

下面是一個使用PowerShell和工作流的並行處理的一個例子:

$server_list = Get-Content -path D:\Path\list_of_servers.txt 
workflow MyWorkflow 
{ 
    foreach -parallel($s in $server_list) { 
     inlinescript { (Get-Service -Name '*Service Name*' -PSComputerName $s) | Where-Object {$_.status -eq "Stopped"} | Set-Service -Status Running 
     } 
    } 
} 

使用PowerShell V2和就業

未經測試的代碼,但應接近:

$server_list = Get-Content -path D:\Path\list_of_servers.txt 

$maxJobs = 5 
$scriptblock = { 
(Get-Service -Name $args[1] -ComputerName $args[0]) | Where-Object {$_.status -eq "Stopped"} | Set-Service -Status Running 
} 

foreach ($s in $server_list) 
{ 
    $arguments = @($s, $service) 

    $running = @(Get-Job | Where-Object { $_.State -eq 'Running' }) 
    while ($running.Count -gt ($maxJobs -1)) { 
     $done = Get-Job | Wait-Job -Any 
     $running = @(Get-Job | ? {$_.State -eq 'Running'}) 
    } 
    start-job -scriptblock $scriptblock -ArgumentList $arguments 
} 
Get-Job | Wait-Job 
Get-Job | Receive-Job 
+0

優秀的答案! – xXhRQ8sD2L7Z 2014-12-08 10:49:53

+1

它會起作用,但爲了重新啓動服務而啓動後臺工作似乎從資源的角度來看有點過分。 – mjolinor 2014-12-08 12:12:53