【问题标题】:Pass variables to Foreach-Object PowerShell 7将变量传递给 Foreach-Object PowerShell 7
【发布时间】:2020-09-16 07:36:30
【问题描述】:

我想要什么:

我有一个脚本,它将 CAB 文件复制到一百多个服务器,并在它们上使用它。 这个脚本运行了一个多星期。 当我了解 Foreach-Object -parallel 功能时,我认为这会大大加快脚本的速度。但是我遇到了一个问题。由于我不是很了解 PowerShell,而且我在任何地方都没有找到有关此问题的帖子,所以我想,我要试试运气并在这里问:

预期和实际结果

我想将一个变量传递给 foreach-object cmdlet 中已执行的脚本块,如下所示:

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

我的期望:

1, 123
2, 123
3, 123

我得到了什么:

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

我做错了什么?

这可能是一个小问题。但是因为我什么地方都没有,也没有找到任何帖子/代码示例。我把它贴在这里。感谢您的回答。

【问题讨论】:

  • 如果脚本运行时间超过一周,我认为您需要对架构进行重大重写。并行处理可能是一种方法,但可能还有其他更智能的方法。
  • 我怀疑您需要对流程进行全面返工。一种方法是将复制命令放到远程系统并让他们进行复制。您当前的大纲给人的印象是您正在从源复制到运行代码的系统,最后复制到目标。一种更快的方法是从源到目的地 - 并在目的地控制它。
  • @Lee_Dailey 这正是我想要做的。我得到了像你提到的这样的脚本:foreach Server copy cab-file,do stuff。我现在这样做:servers|foreach-object -parallel{invoke command to server (copy cab-file, do stuff)}。为了确保可读性,我想在 foreach 对象之外定义变量、函数并传递它们。在那里我遇到了我的问题。
  • 啊!我在您的问题中没有看到这一点……但看起来 MartinBrandl 已经指出了问题和解决方法。优秀! [咧嘴]

标签: powershell powershell-7.0 foreach-object


【解决方案1】:

您可以通过使用 using keyword 来简化它:-)

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

【讨论】:

  • 我想知道为什么在填充搜索结果的 M$ 帮助页面上找不到类似的内容。谢谢!
  • ForEach-Object的注释部分有关于-Parallel$using的注释。
猜你喜欢
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 2023-01-02
  • 1970-01-01
  • 2014-01-01
  • 2021-08-14
相关资源
最近更新 更多