我一直在尝试对通过CSV导入并由ForEach-Object
调用的数据(例如服务器名称列表)执行并行命令。我发现foreach有一个并行方法,但似乎ForEach-Object
没有。当我点击多个服务器读取日志数据时,我担心性能良好,并且有以下选项:
1) PowerShell Workflow
2) PowerShell Background Job
3) Invoke-Command
当我尝试选项3时,它失败了,因为我试图通过-ArgumentList发送参数,但它似乎不喜欢我以CSV形式从CSV推送的变量:
$($_.'CSVColumnValue')
是否可以使用ForEach-Object
并行执行命令,如果是,推荐的方法是什么?
答案 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' }