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
您可以查看Jobs或runspaces.以下是乔布斯的一个例子:
$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不能指定大括号{}之外的参数.
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)
根据Get-Help about_Foreach-Parallel,ForEach -Parallel...将为每个项目并行处理整个脚本块,但是脚本块中的命令将按顺序处理(尽管如果用括号括起来,它们将被并行化Parallel {...}).但是,您的脚本必须是PowerShell工作流才能接受此操作; 在Parallel和Sequence关键字只有工作流程内有效.
| 归档时间: |
|
| 查看次数: |
28246 次 |
| 最近记录: |