【发布时间】:2019-11-21 11:07:15
【问题描述】:
Powershell 在移动到脚本的下一行之前正在等待服务启动或停止,但我需要它在不等待的情况下继续运行。
这背后的想法是,我们需要在多个服务器上启动和停止多个服务,如果我们等待每个服务连续启动,则可能需要数小时才能运行完整的脚本。
我在网上看到的一切都是PowerShell需要一个命令来告诉它等待,但我的经验是PS会等待服务而不接收任何显式命令。
Write-host "Starting services..."
## Remote Start XXX services
Write-Host "Starting XXX services..."
Get-Service -Name ServiceXXX -ComputerName computerXXX | Start-service
Get-Service -Name ServiceXXX -ComputerName computerYYY | Start-service
Get-Service -Name ServiceXXX -ComputerName computerZZZ | Start-service
## Remote Start YYY services
Write-Host "Starting YYY services..."
Get-Service -Name ServiceYYY -ComputerName computerAAA | Start-service
Get-Service -Name ServiceYYY -ComputerName computerBBB | Start-service
Get-Service -Name ServiceYYY -ComputerName computerCCC | Start-service
理想情况下,我希望代码运行,以便 computerYYY 上的 ServiceXXX 不等待 computerXXX 上的 ServiceXXX,等等每个服务。
在脚本中,我可以选择启动、停止和检查。在继续之前,我们并不担心系统检查。
现在,PS 将运行“等待 ServiceXXX 启动...”并将重复该消息大约 30 或 40 秒。然后它移动到下一行。一旦我们开始讨论数十个远程服务器和每个服务器上的数十个服务,您就会明白为什么这需要很长时间。
【问题讨论】:
-
您可以考虑使用 PowerShell 作业。您可以从Start-Job 开始,看看它是否符合要求。然后,您可以稍后在空闲时检索工作信息。
-
sc命令将在不等待完成的情况下启动服务。如果您想通过Start-Service异步启动服务,您可以在后台作业中执行此操作。 -
您是否尝试过通过
Invoke-Command在目标系统上运行*-Servicecmdlet?该 cmdlet 将接受一组计算机名称和一个脚本块 - 您可以告诉它忽略错误。然后 - 如果您需要非响应者 - 您可以从输入列表和响应者列表中获取它们。 -
由于
Get-Service将来不会再有参数-CompterName,从 PowerShell v6 开始,您可能仍想考虑使用Invoke-Command。像这样的东西:Invoke-Command -Computer AAA, BBB, CCC -ScriptBlock { Get-Service -Name YYY | Start-Service } -AsJob.
标签: powershell service command remote-server