在PowerShell中并行运行任务

时间:2017-04-28 17:09:32

标签: powershell foreach parallel-processing task

我有一个像这样的PowerShell脚本:

Foreach ($file in $files) {
    [Do something]
    [Do something]
    [Do something]
}

这样,一个文件将在另一个文件之后处理。我想同时处理4个文件。

我知道foreach -parallel循环,但是并行执行[do something]任务。我基本上想要并行运行整个foreach循环。

我如何在PowerShell中实现这一目标?

3 个答案:

答案 0 :(得分:20)

您可以查看Jobsrunspaces。以下是乔布斯的一个例子:

$block = {
    Param([string] $file)
    "[Do something]"
}
#Remove all jobs
Get-Job | Remove-Job
$MaxThreads = 4
#Start the jobs. Max 4 jobs running simultaneously.
foreach($file in $files){
    While ($(Get-Job -state running).count -ge $MaxThreads){
        Start-Sleep -Milliseconds 3
    }
    Start-Job -Scriptblock $Block -ArgumentList $file
}
#Wait for all jobs to finish.
While ($(Get-Job -State Running).count -gt 0){
    start-sleep 1
}
#Get information from each job.
foreach($job in Get-Job){
    $info= Receive-Job -Id ($job.Id)
}
#Remove all jobs created.
Get-Job | Remove-Job

在上面的代码中我得到了每个$file并行运行的地方(最多同时运行4个)。

编辑:在回复评论时,here是关于scriptblocks的一些文档。关于为什么必须包含参数的简短原因是因为与PowerShell函数不同,scriptblocks不能在大括号{}之外指定参数。

答案 1 :(得分:5)

根据Get-Help about_Foreach-ParallelForEach -Parallel...将为每个项目并行处理整个脚本块,但是脚本块中的命令将按顺序处理(尽管如果用{{1括起来,它们将被并行化) }})。但是,您的脚本必须是PowerShell工作流才能接受此操作; Parallel {...}Parallel关键字仅在工作流程中有效。

答案 2 :(得分:3)

Powershell 7引入了foreach-object -parallel

https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/

您的脚本会说

$files | ForEach-Object -parallel {
    [Do something]
    [Do something]
    [Do something]
}