Powershell 并行启动服务

Powershell 并行启动服务,powershell,remote-access,Powershell,Remote Access,我有一个脚本,它检查不同服务器上的某些服务是否已启动,如果未启动,脚本应启动该服务 问题是,它不会并行启动服务,而是等待每个服务启动 代码: 我知道这是因为剧本的编写方式,但也许你们中的一些人有什么建议可以让它变得更好 干杯 以下是使用Powershell和工作流的并行处理示例: $server_list = Get-Content -path D:\Path\list_of_servers.txt workflow MyWorkflow { foreach -parallel($s i

我有一个脚本,它检查不同服务器上的某些服务是否已启动,如果未启动,脚本应启动该服务

问题是,它不会并行启动服务,而是等待每个服务启动

代码:

我知道这是因为剧本的编写方式,但也许你们中的一些人有什么建议可以让它变得更好


干杯

以下是使用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

以下是使用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

您正在运行哪个版本的Powershell?对于V3和V4,您可以使用
foreach-parallel
您有没有考虑过使用
启动作业
?@MickyBalladelli遗憾的是,我们正在使用V2@ST8Z6FR57ABE6A8RE9UF不,我会查看。我在答案中添加了一个作业示例。您正在运行哪个版本的Powershell?对于V3和V4,您可以使用
foreach-parallel
您有没有考虑过使用
启动作业
?@MickyBalladelli遗憾的是,我们正在使用V2@ST8Z6FR57ABE6A8RE9UF不,我会查的。我在答案中添加了一个乔布斯的例子。它会有用的,但是,从资源的角度来看,旋转后台作业只是为了重新启动服务似乎有点笨手笨脚。这是可行的,但从资源的角度来看,旋转后台作业只是为了重新启动服务似乎有点笨手笨脚。