我有一个像这样的 PowerShell 脚本:
Foreach ($file in $files) {
[Do something]
[Do something]
[Do something]
}
这样,一个文件就会在另一个文件之后被处理。我想同时处理 4 个文件。
我知道 foreach 并行循环,但它会并行执行 [do some] 任务。我基本上想并行运行整个 foreach 循环。
如何在 PowerShell 中实现此目的?
最佳答案
您可以查看 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是一些关于脚本 block 的文档。必须包含该参数的简短原因是因为与 PowerShell 函数不同,脚本 block 无法在大括号 {} 之外指定参数。
关于powershell - 在 powershell 中并行运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43685522/