【问题标题】:Is there a PowerShell command to tell PS not to wait for a service to start before continuing?是否有 PowerShell 命令告诉 PS 在继续之前不要等待服务启动?
【发布时间】: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 在目标系统上运行*-Service cmdlet?该 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


【解决方案1】:

使用powershell jobs 在后台运行任务。当您将它们全部启动后,您可以等待它们完成。像这样的:

$jobs = @()
Write-host "Starting services..."

## Remote Start XXX services
   Write-Host "Starting XXX services..."
   $jobs += Start-Job {Get-Service -Name ServiceXXX -ComputerName computerXXX | Start-service}
   $jobs += Start-Job {Get-Service -Name ServiceXXX -ComputerName computerYYY | Start-service}
   $jobs += Start-Job {Get-Service -Name ServiceXXX -ComputerName computerZZZ | Start-service}

## Remote Start YYY services
   Write-Host "Starting YYY services..."
   $jobs += Start-Job {Get-Service -Name ServiceYYY -ComputerName computerAAA | Start-service}
   $jobs += Start-Job {Get-Service -Name ServiceYYY -ComputerName computerBBB | Start-service}
   $jobs += Start-Job {Get-Service -Name ServiceYYY -ComputerName computerCCC | Start-service}

#Now wait for them to complete
Wait-Jobs $jobs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多