powershell并行运行脚本

时间:2016-03-07 12:25:05

标签: multithreading powershell parallel-processing start-job

我正在使用Windows Server 2003,现在我有一个脚本来重新启动一个特定的服务,有人可以指导我如何并行运行这个脚本吗?我已经使用了start-job,但似乎它只在backround中运行但仍然是顺序的,下面是我的脚本:

文件名:restart-service.ps1

$start = Get-Date
$Serverlist = Get-Content -path C:\Computers.txt

ForEach ($Server in $Serverlist){
start-job -scriptblock {param($Server) Restart-Service -InputObject $(Get-Service -ComputerName $Server -Name "aspnet_state")} -ArgumentList $Server
}
Get-Job | Wait-Job
Get-Job | Receive-Job
$end = Get-Date
$timespan = $end - $start
$seconds = $timespan.TotalSeconds
Write-Host "This took me $seconds seconds."

或者

$start = Get-Date
$Server = Get-Content -path C:\Computers.txt

$scriptblock = {
    Param($Server)
    Restart-Service -InputObject $(Get-Service -ComputerName $Server -Name "aspnet_state")
}
$Server | % {Start-Job -Scriptblock $scriptblock -ArgumentList $_ | Out-Null}
Get-Job | Wait-Job | Receive-Job

$end = Get-Date
$timespan = $end - $start
$seconds = $timespan.TotalSeconds
Write-Host "This took me $seconds seconds."

但我只能看到结果,但看不到我服务器IP的任何结果相关信息,有人可以帮我改进它吗......

1 个答案:

答案 0 :(得分:1)

这是方向,根据您的特定需求调整它...添加计时器等......

$Serverlist = Get-Content -path C:\Computers.txt

Foreach ($Server in $Serverlist)
{
    Start-Job -Name "$Server-Job" -ScriptBlock {
    Get-Service -ComputerName $args[0] -Name "aspnet_state" | Restart-Service 
    } -ArgumentList $Server
}

它将为每个服务器创建一个具有ServerName的作业,以获取作业状态/信息,使用:

Get-Job | Receive-Job