首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以并行执行ForEach-Object命令

可以并行执行ForEach-Object命令
EN

Stack Overflow用户
提问于 2016-03-04 19:24:19
回答 2查看 7.2K关注 0票数 3

我一直试图对通过CSV导入并由ForEach-Object调用的数据(例如服务器名称列表)执行并行命令。我已经发现foreach有一个并行的方法,但是看起来ForEach-Object没有。当我访问多个服务器来读取日志数据时,我对良好的性能感到担忧,并有以下选项:

代码语言:javascript
复制
1) PowerShell Workflow 
2) PowerShell Background Job 
3) Invoke-Command

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

代码语言:javascript
复制
$($_.'CSVColumnValue')

是否可以使用ForEach-Object并行执行命令,如果可以,建议采用什么方法来实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-13 00:06:39

没有“ForEach-Object-Parallel”这样的东西,因为它是在管道中执行的。检查在MSDN第九频道的Erik Meijer和Jeffrey Snover;那些人正在PowerShell的管道上获取信息。从2008年开始,持续了一个多小时,但是.很好的管道运作方式。

“ForEach-Parallel”是一个构造,而不是管道cmdlet。它是工作流程模块的一部分,并在WindowsWindows3.0中引入。

比较:

代码语言:javascript
复制
$Items = 1..42
ForEach -Parallel ($Item in $Items) {
 $Item
}

通过以下方式:

代码语言:javascript
复制
1..42 | ForEach-Object -Process { $_ }
票数 4
EN

Stack Overflow用户

发布于 2019-10-07 14:43:28

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

代码语言:javascript
复制
$a = 'hi there'
invoke-command comp001 { echo $using:a }

或者用管道把东西吸进来:

代码语言:javascript
复制
1,2,3 | invoke-command comp001 { echo $input } 

只有在scriptblock中定义了param时,-argumentlist才能工作。医生们在这一点上做得不好。

代码语言:javascript
复制
$a = 'hi'
invoke-command comp001 { param($a) echo $a } -ArgumentList $a

除非您使用args:

代码语言:javascript
复制
invoke-command comp001 { echo $args[0] } -ArgumentList $a

Powershell 7预览3实际上有一个多线程"foreach-object -parallel":

代码语言:javascript
复制
 1..5 | ForEach-Object -Parallel { sleep 10; 'done' }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35852147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档