【问题标题】:Run Simultaneous Functions for Patch Automation with PowerShell使用 PowerShell 运行同步函数以实现补丁自动化
【发布时间】:2020-05-04 23:01:40
【问题描述】:

我看到过有关并行或同时并行运行函数的不同帖子,但答案中的代码对我来说不太有效。我正在做修补自动化,我拥有的所有功能都可以单独工作,但由于我们使用 200 多台计算机,因此等待每个功能完成其批次的计算机有点违背了目的。我将代码放在一个脚本中,总而言之,其结构如下:

定义全局变量

$global:varN

定义子函数

函数子函数1()

函数子函数N()

定义主要功能

函数 InstallGoogleFunction($global:varN) {

$var1

$result1 = 子函数1

$resultN = 子函数N

}

函数安装VLCFunction($global:varN) {

“类似上面的代码”

}

函数 InstallAppFunction($global:varN) {

“类似上面的代码”

}

这些函数都将安装不同的应用程序/软件并将输出写入文件。唯一的问题是,如果不等待第一个功能完成,我似乎无法运行所有安装功能。我尝试了启动作业代码,但它执行并显示了一个类似输出的表格,但是在验证计算机时任务管理器上没有运行任何东西。有没有办法powershell可以同时运行这个安装功能?如果我不得不求助于一个接一个,我会以最少的时间或最少的计算机调用这些功能,他们需要安装的功能我会,但我只是希望有人更好地解释这是否可以完成.

【问题讨论】:

  • 你的意思是说要在同一台机器上同时安装多个软件并行?
  • 你的软件安装需要重启目标机器吗?
  • 在多台远程机器上同时安装多个软件。无需重新启动其中任何一个。
  • 要在多台远程机器上并行运行代码,请使用Invoke-Command
  • format your code and sample input/output properly。顺便说一句:如果您使用的是全局变量,那么将它们声明为 参数 不仅没有意义,而且实际上也不起作用。

标签: function powershell parallel-processing automation powershell-remoting


【解决方案1】:

您可以使用多线程来实现这一点。下面的示例展示了如何在 PowerShell 中使用多线程触发多个任务。

用您的机器替换$Computers 中的机器列表并试一试。下面的示例获取给定机器上的磁盘详细信息

# This is your script you want to execute
$wmidiskblock = 
{ 
  Param($ComputerName = "LocalHost") 
  Get-WmiObject -ComputerName $ComputerName -Class win32_logicaldisk |  Where-Object {$_.drivetype -eq 3} 
} 

# List of servers
$Computers = @("Machine1", "Machine2", "Machine3")  

#Start all jobs in parallel 
ForEach($Computer in $Computers) 
{ 
   Write-Host $Computer 
   Start-Job -scriptblock $wmidiskblock  -ArgumentList $Computer 
} 

Get-Job | Wait-Job 

$out = Get-Job | Receive-Job 
$out |export-csv 'c:\temp\wmi.csv'

【讨论】:

  • 这将在 本地 并行运行代码(即使代码恰好是针对远程计算机的 Get-WmiObject 调用)。我认为 OP 的意图是并行运行代码在远程机器上。还要注意Start-Job 使用子进程,而不是线程(这就是它很慢的原因);但是,有一个基于线程的 Start-ThreadJob cmdlet 可通过 ThreadJob 模块使用(随 PowerShell v6+ 提供,可在旧版本中下载)。
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多