如何在同一时间(并行)在远程计算机上调用-命令相同的功能

时间:2018-07-31 18:43:51

标签: multithreading powershell

我正在处理一个脚本,该脚本具有一些需要花费时间才能在不同的远程计算机上执行的功能。有什么办法可以同时并行调用它们?一个例子将不胜感激。谢谢

1 个答案:

答案 0 :(得分:2)

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参数进行修改。

要针对远程系统执行 local 功能,您必须使用一些技巧:

# 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

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