【问题标题】:How to Invoke-Command the same function on remote computers in the same time (parallel)如何在同一时间(并行)在远程计算机上调用命令相同的功能
【发布时间】:2018-07-31 18:43:50
【问题描述】:

我正在编写一个脚本,该脚本具有多个需要时间在不同远程计算机上执行的功能。有什么方法可以同时以并行方式调用命令它们吗?一个例子将不胜感激。谢谢

【问题讨论】:

标签: multithreading powershell


【解决方案1】:

Invoke-Command 已经对每台计算机并行执行调用,as part of built-in functionality

一对多远程处理

远程处理的真正强大之处在于能够将命令并行发送到一台或多台远程计算机。每台远程计算机执行命令,将生成的对象序列化为 XML,并通过网络将结果传输到您的计算机。

您的计算机接收 XML 并将其反序列化回静态对象。这使您可以使用与任何其他命令输出几乎相同的方式来处理命令输出。

一切都从 Invoke-Command cmdlet 开始。在其最简单的形式中,您只需以脚本块的形式指定要运行的命令,以及在其上运行该命令的一台或多台计算机。例如,要从文本文件中读取计算机名称列表(每行一个名称)并在每个名称上运行命令,请使用:

Invoke-Command –scriptblock { Get-EventLog Security –newest 200 } –computername (Get-Content computernames.txt)

当结果进入您的计算机时,它们将附加一个名为 PSComputerName 的附加属性。这使您可以查看哪个结果来自哪台计算机。这很有帮助,因为它们可能不会都以相同的顺序收到。

-ComputerName 参数可以接受一个列表/数组,并且它将并行地对它们执行一个远程命令(而不是一次执行一个)。如果要针对正在进行的会话执行多个命令,也可以使用 -Session 参数。

注意:请记住,默认情况下,这一次限制为 32 个并发连接。这可以通过-ThrottleLimit 参数进行修改。

要对远程系统执行本地函数,你必须使用一个小技巧:

# Let's say the function is called 'Do-Thing'
$Computers = 'node1','node2'
Invoke-Command -ComputerName $Computers -ScriptBlock ${function:Do-Thing} -ArgumentList 'arg1'

不过,将函数/脚本简单地保存到要执行的文件中可能会更容易:

Invoke-Command -ComputerName $Computers -FilePath .\script.ps1

进一步跟进:

Update-Help
help Invoke-Command -Full
help about_Remote

如果需要,请查看以下链接:

【讨论】:

  • 一次执行的次数有一个默认限制,我相信限制是 32。您可以使用-ThrottleLimit 参数来控制它。例如,您可以使用-ThrottleLimit 1 让它一次只执行一个,但您可以指定自己的阈值。
  • @BendertheGreatest 很棒的电话。我已修改我的答案以包含此内容。
  • 您好,首先感谢您的帮助。我完全同意你提出的观点。但是,我正在调用的函数返回一个布尔值。其他函数取决于第一个函数中返回的布尔值。当我按照您建议的方式调用命令时,我得到了一个布尔值数组,这导致我的函数(需要布尔值作为参数)无法正常工作。因此,我想找出一种更有效的方法来并行调用命令它们。
  • @Karl-JoeyG.Chami 所以远程工作有效,对吧?你的问题听起来太模糊了。如果您的第二个功能不能与布尔值一起正常工作,这听起来像该功能需要一些故障排除,因为它不再是远程处理的问题,对吗?听起来您需要将函数和脚本代码放入文件中,并将-FilePath 方法与.ps1 文件一起使用。如果您还需要研究如何让函数接受来自管道的值,或者让函数接受数组,您可能还需要尝试 help about_Functionshelp about_Functions_Advanced_Parameters
  • @Karl-JoeyG.Chami - @ScriptAutomate 的建议会起作用,但如果您无法更改函数定义,那么您将不得不处理返回的结果数组中的每个响应(真或假)来自Invoke-Command。这实际上是在远程服务器上执行代码的一种非常有效的方法,但是当您对多台计算机/服务器运行命令时,应该预计您也需要处理多个结果。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多