如何在PowerShell中并行使用foreach循环?

在PowerShell中有两种并行使用foreach循环的方法。

  • 使用Foreach-Object -Parallel命令(在PowerShell 7.0或更高版本中支持)

  • 在工作流中使用Foreach -Parallel(支持PowerShell 5.1或更低版本)

假设我们有Servers.txt,其中包含10台服务器。当我们使用Parallel for循环时,不能保证首先选择哪个服务器循环,如下所示,并带有两个示例。

  • 使用Foreach - Object - Parallel命令。(不是Foreach -Parallel)

此Foreach-Object -Parallel命令功能已新添加到PowerShell版本7.0或更高版本中。

示例

$servers = Get-Content C:\Temp\Servers.txt

$servers | foreach-Object -parallel{
   Write-output "Working on $_"
}
输出结果
PS C:\> C:\Temp\Test1.ps1
Working on IndiaServer003
Working on IndiaServer002
Working on IndiaServer001
Working on USServer001
Working on IndiaServer005
Working on USServer002
Working on IndiaServer006
Working on NZServer001
Working on NZServer002

如果您有更多服务器,还可以设置-Throttlelimit参数,但需要确保系统不会由于节流阀限制而耗尽,因为它将创建更多的运行空间。

  • 使用PowerShell工作流。

如果使用的是PowerShell 5.1,则可以使用工作流功能Foreach -Parallel并行运行循环。例如,

示例

Workflow TestParallel{
   Foreach -parallel($server in (Get-Content C:\Temp\Servers.txt)){
      Write-Output "Working on $Server"
   }
}

TestParallel
输出结果
PS C:\WINDOWS\system32> C:\Temp\Test1.ps1
Working on NZServer002
Working on NZServer001
Working on USServer002
Working on USServer001
Working on IndiaServer006
Working on IndiaServer005
Working on IndiaServer003
Working on IndiaServer002
Working on IndiaServer001