我有一个像这样的PowerShell脚本:
Foreach ($file in $files) {
[Do something]
[Do something]
[Do something]
}
这样,一个文件将在另一个文件之后处理。我想同时处理4个文件。
我知道foreach -parallel循环,但是并行执行[do something]任务。我基本上想要并行运行整个foreach循环。
我如何在PowerShell中实现这一目标?
答案 0 :(得分:20)
您可以查看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
在上面的代码中我得到了每个$file
并行运行的地方(最多同时运行4个)。
编辑:在回复评论时,here是关于scriptblocks的一些文档。关于为什么必须包含参数的简短原因是因为与PowerShell函数不同,scriptblocks不能在大括号{}之外指定参数。
答案 1 :(得分:5)
根据Get-Help about_Foreach-Parallel
,ForEach -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]
}