在PowerShell中并行运行任务

Wer*_*ker 16 parallel-processing powershell foreach task

我有这样的PowerShell脚本:

Foreach ($file in $files) {
    [Do something]
    [Do something]
    [Do something]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cur*_*One 25

您可以查看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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中我得到了它们彼此$file并行运行(最多同时运行4个).

编辑:在回应评论时,这里有一些关于scriptblocks的文档.关于为什么必须包含参数的原因很简单,因为与PowerShell函数不同,scriptblocks不能指定大括号{}之外的参数.

  • 做得很好,尽管我建议您使用`Wait-Job` cmdlet代替您包括的所有奇特逻辑来获得正在运行的作业并等待它们完成。[链接到我个人从中学习过的类似的运行空间的演练。](https://foxdeploy.com/2016/05/17/part-v-powershell-guis-sensitive-apps-with-progress-酒吧/) (2认同)
  • 您愿意添加一个使用运行空间的示例吗?我正在阅读并尝试将您的作业示例转换为使用运行空间,但无法弄清楚。 (2认同)

sta*_*and 9

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]
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*lin 5

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

  • 来自https://msdn.microsoft.com/en-us/powershell/reference/5.1/psworkflow/about/about_foreach-parallel:描述Windows PowerShell工作流中的ForEach -Parallel语言构造.如果您不*使用工作流,则不存在-Parallel参数.我没有感觉OP正在使用工作流程. (4认同)