powershell 脚本在 100 台计算机上重新启动服务

Posted

技术标签:

【中文标题】powershell 脚本在 100 台计算机上重新启动服务【英文标题】:powershell script restart services on 100s computers 【发布时间】:2021-11-19 15:14:58 【问题描述】:

我需要重新启动数百个服务,这取决于远程计算机上的备份作业是否失败

$services = "winmgmt", "cryptsvc", "vss"
$computers = get-content "$env:\userprofile\servers.txt"
foreach ($srv in $ computers) 
get-service -computername $srv $services | restart-service -force

虽然这可行,但它不会异步执行,一次只能执行一个,有没有办法可以一次将作业发送到所有机器?

【问题讨论】:

invoke-command comp1,comp2,comp3 并行运行。 @js2010 我不知道,谢谢。 【参考方案1】:

您可以使用 Invoke-Command 将命令作为作业运行,然后您可以等待所有作业完成,这样应该可以做到。

$computers = get-content "$env:\userprofile\servers.txt"
$sb = 
    $services = "winmgmt", "cryptsvc", "vss"
    get-service -Name $services | Restart-Service -PassThru | Get-Service

Invoke-Command -ComputerName $computers -ScriptBlock $sb

【讨论】:

不错。 Invoke-Command 也同时接受多个计算机名称,所以你可以这样做 Invoke-Command -ComputerName $computers -ScriptBlock $sb -AsJob |Wait-Job |Receive-Job 更好,感谢@MathiasR.Jessen 我已经更新了 谢谢。有没有办法验证服务是否重新启动? 您可以将 Restart-Service 与 Passthru 一起使用并将其通过管道传回 get-service 以确保服务再次运行(Restart-Service -PassThru | Get-Service) Invoke-Command -ComputerName $computers -ScriptBlock $sb -AsJob |Wait-Job |Receive-Job ..... receive-job 有什么作用?【参考方案2】:

invoke-command 并行运行演示:

# elevated prompt
measure-command  
  invoke-command localhost,localhost,localhost  sleep 5   | 
  % seconds

5

【讨论】:

以上是关于powershell 脚本在 100 台计算机上重新启动服务的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用模拟在远程计算机上运行 PowerShell 脚本时“不允许请求的注册表访问”

远程注册表项提取程序PowerShell脚本

使用Powershell访问远程Oracle数据库

PowerShell初探

如何在 Powershell 脚本中提供管理员凭据

使用 powershell 访问远程计算机时出现审计错误