首页 > 解决方案 > 如何在同一时间(并行)在远程计算机上调用命令相同的功能

问题描述

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

标签: multithreadingpowershell

解决方案


Invoke-Command作为内置功能的一部分,已经对每台计算机并行执行调用:

一对多远程处理

远程处理的真正威力是能够将命令并行发送到一台或多台远程计算机。每台远程计算机执行命令,将生成的对象序列化为 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

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


推荐阅读