可以并行执行ForEach-Object命令

时间:2016-03-04 19:24:20

标签: powershell

我一直在尝试对通过CSV导入并由ForEach-Object调用的数据(例如服务器名称列表)执行并行命令。我发现foreach有一个并行方法,但似乎ForEach-Object没有。当我点击多个服务器读取日志数据时,我担心性能良好,并且有以下选项:

1) PowerShell Workflow 
2) PowerShell Background Job 
3) Invoke-Command

当我尝试选项3时,它失败了,因为我试图通过-ArgumentList发送参数,但它似乎不喜欢我以CSV形式从CSV推送的变量:

$($_.'CSVColumnValue')

是否可以使用ForEach-Object并行执行命令,如果是,推荐的方法是什么?

2 个答案:

答案 0 :(得分:4)

没有' ForEach-Object -Parallel'因为它是在管道中执行的。检查Erik Meijer and Jeffrey Snover at MSDN Channel 9;那些人是开心的。 PowerShell管道上的细节。它是2008年的视频,持续了一个多小时,但仍然......管道的工作方式非常出色。

' ForEach -Parallel'是一个构造而不是管道cmdlet。它是Workflow模块的一部分,并在Windows PowerShell 3.0中引入。

比较

$Items = 1..42
ForEach -Parallel ($Item in $Items) {
 $Item
}

使用:

1..42 | ForEach-Object -Process { $_ }

答案 1 :(得分:1)

就invoke-command而言,您需要使用“使用”范围来访问局部变量:

$a = 'hi there'
invoke-command comp001 { echo $using:a }

或通过管道输入内容:

1,2,3 | invoke-command comp001 { echo $input } 

-argumentlist仅在脚本块中定义了参数时才有效。文档在这一点上不好。

$a = 'hi'
invoke-command comp001 { param($a) echo $a } -ArgumentList $a

除非您使用args:

invoke-command comp001 { echo $args[0] } -ArgumentList $a

Powershell 7 Preview 3实际上具有多线程“ foreach-object -parallel”:

 1..5 | ForEach-Object -Parallel { sleep 10; 'done' }