0

我需要启动一个有序的服务序列,我需要在尝试启动下一个服务之前启动并运行每个服务,如何在 Powershell 中实现这一点?我怎么能等到站呢?

谢谢,

DD

4

3 回答 3

3

不要手动执行此操作(无论脚本语言如何)。定义服务之间的正确依赖关系,Windows 将以正确的顺序启动/停止它们。您可以使用该sc实用程序来定义依赖项:

sc config Svc2 depend= Svc1

如果一项服务应该依赖于多个其他服务,则使用正斜杠分隔相关服务:

sc config Svc5 depend= Svc3/Svc4

请注意,后面= 必须有一个空格,并且不能在前面有一个。

于 2013-09-19T10:56:21.623 回答
1

如果您有服务名称列表(例如在数组中),则 foreach 服务:

  1. 获取其状态
  2. 如果没有运行,则启动它
  3. 在循环中有延迟,检查它的状态直到它运行

关键可能是处理#3 的所有可能性,包括服务失败。

但是大纲会是这样的(不处理错误情况):

$serviceNames | Foreach-Object -Process {
  $svc = Get-Service -Name $_
  if ($svc.Status -ne 'Running') {
    $svc.Start()
    while ($svc.Status -ne 'Running') {
      Write-Output "Waiting for $($svc.Name) to start, current status: $($svc.Status)"
      Start-Sleep -seconds 5
    }
  }
  Write-Output "$($svc.Name) is running"
}

Get-Service返回一个System.ServiceProcess.ServiceController“活动”的实例——指示服务的当前状态,而不仅仅是创建实例时的状态。

类似的停止过程会将“正在运行”替换为“已停止”,将“开始”调用替换为“停止”。并且,大概,颠倒服务列表的顺序。

于 2013-09-19T09:16:19.237 回答
0

停止服务

$ServiceNames = Get-Service | where {($_.Name -like "YourServiceNameHere*")-and ($_.Status -eq "Running")}
 Foreach-Object {$_.(Stop-Service $serviceNames)}

启动服务

$ServiceNames = Get-Service | where {($_.Name -like "YourServiceNameHere*")-and ($_.Status -ne "Running")}
Foreach-Object {$_.(Start-Service $ServiceNames)}
于 2018-11-13T08:47:45.470 回答