multithreading - 如何在同一时间(并行)在远程计算机上调用命令相同的功能
问题描述
我正在编写一个脚本,该脚本具有多个需要时间在不同远程计算机上执行的功能。有什么方法可以同时以并行方式调用命令它们吗?一个例子将不胜感激。谢谢
解决方案
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
如果需要,请查看以下链接:
- 远程函数演练示例:在 PowerShell 中远程运行本地函数
- PowerShell 远程处理的秘密(LeanPub 电子书,可选择免费下载)
- about_Remote(在线文档)
- 调用命令(在线文档)
- StackOverflow 可能重复:使用 PowerShell 的 Invoke-Command 进行远程处理时,如何包含本地定义的函数?
推荐阅读
- behat - 在 Behat 中是否有任何自定义函数可以传递用户凭据来测试 API 响应?
- android - 以粗体、斜体和下划线显示和保存 Edittext 的选择性文本,并发送到在 android 中编辑的服务器
- version-control - SSMS 的位桶源控制,团队资源管理器:无法创建 SSL/TLS 安全通道
- swift - Swift:确保来自具有关联类型的不同协议的等价性
- angular - Ionic 插件 BLE(和所有其他插件)不是函数错误 | Ionic4 和 Angular 7
- ios - 我应该把视图构建器方法方法放在哪里?
- random - 如何在 vhdl 代码中随机化数组的元素?
- anaconda - 如何删除此错误“ModuleNotFoundError: No module named 'sklearn.cross_validation'”
- javascript - 如何在php中打印js变量
- android - 如何清除getIntent().getAction()的值