将变量传递给 Foreach-Object PowerShell 7

10

我想要的:

我有一个脚本,用于将CAB文件复制到一百多个服务器上,并在这些服务器上处理它们。 这个脚本运行了一个星期以上。 当我了解到 Foreach-Object -parallel 特性时,我认为这会大大加速脚本。但是我遇到了一个问题。由于我对 PowerShell 不太熟悉,而且我没有在任何地方找到关于这个问题的帖子,所以我想试一试并请教在这里的人:

预期和实际结果

我想向 foreach-object 命令中执行的 scriptblock 传递一个变量,就像这样:

$test = "123"
1..3|foreach-object -parallel {param($test);echo "$_, $test"} -ArgumentList($test)

我的期望:

1, 123
2, 123
3, 123

我的问题:

ForEach-Object:无法使用指定的命名参数解析参数集。一个或多个参数无法一起使用,或者提供的参数不足。

我做错了什么?

可能是一个微小的问题。但由于我找不到任何帖子/代码示例,所以我在这里发布了它。感谢回答。


2
如果脚本运行时间超过一周,我认为你需要在架构上进行重大改写。并行处理可能是一种方法,但可能还有其他更聪明的方法。 - vonPryz
我怀疑你需要对整个流程进行彻底的重新设计。一种方法是放弃将复制命令发送到远程系统,让它们自己完成复制。你目前的概述给人的印象是从源系统复制到运行代码的系统,最后再复制到目标系统。更快的方法是直接从源系统到目标系统,并在目标系统上进行控制。 - Lee_Dailey
@Lee_Dailey,这正是我想做的。我得到了像你提到的这样的脚本:对于每个服务器,复制cab文件并执行操作。现在我是这样做的:servers | foreach-object -parallel {invoke command to server (copy cab-file, do stuff)}。为了确保可读性,我想在foreach-object之外定义变量和函数,并传递它们。但我遇到了问题。 - Sukram22
啊!在你的问题中我没有看到那个...但是看起来MartinBrandl已经指出了问题和解决方法。太棒了![咧嘴笑] - Lee_Dailey
1个回答

15

您可以通过使用using关键字来简化它 :-)

$test = "123"
1..3 | foreach-object -parallel { echo "$_, $($using:test)" } 

我想知道为什么在搜索结果中充斥着 M$ 帮助页面,却找不到像这样的东西。谢谢! - Pascal
ForEach-Object 的注释部分中有关于 -Parallel$using 的说明。 - Robert Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接