我搜索了这个论坛并通过谷歌找不到我需要的东西。 我有一个非常大的脚本,我正在寻找一些代码来检查服务是否已启动或停止,然后再继续下一步。
它自己需要循环的功能,直到它停止或启动(转到具有Stopped功能和启动功能)。
总共4个服务几乎具有相同的名称,因此Service Bus *可以用作通配符。
答案 0 :(得分:32)
我无法计算'' Micky发布的战略,工作,所以这就是我如何解决它:
我创建了一个函数,它接受一个searchString(这可能是" Service Bus *")以及我期望服务应该达到的状态。
function WaitUntilServices($searchString, $status)
{
# Get all services where DisplayName matches $searchString and loop through each of them.
foreach($service in (Get-Service -DisplayName $searchString))
{
# Wait for the service to reach the $status or a maximum of 30 seconds
$service.WaitForStatus($status, '00:00:30')
}
}
现在可以使用
调用该函数WaitUntilServices "Service Bus *" "Stopped"
或
WaitUntilServices "Service Bus *" "Running"
如果达到超时时间,则抛出一个不那么优雅的异常:
Exception calling "WaitForStatus" with "2" argument(s): "Time out has expired and the operation has not been completed."
答案 1 :(得分:10)
以下将循环并验证给定服务的状态,直到具有"运行"的服务数量为止。 state等于零(因此它们被停止),所以如果你正在等待服务停止,你可以使用它。
我添加了$MaxRepeat
变量,这将阻止它永远运行。它将按照定义运行20次。
$services = "Service Bus *"
$maxRepeat = 20
$status = "Running" # change to Stopped if you want to wait for services to start
do
{
$count = (Get-Service $services | ? {$_.status -eq $status}).count
$maxRepeat--
sleep -Milliseconds 600
} until ($count -eq 0 -or $maxRepeat -eq 0)
答案 2 :(得分:3)
除了answer of mgarde之外,如果您只想等待一项服务(也受post from Shay Levy的启发),则此衬纸可能会有用:
*ngFor
答案 3 :(得分:0)
我不得不对多个计数器进行一些微调,因为该服务故意启动和停止很慢。原始脚本使我走上了正轨。我必须等待服务完全停止后才能继续操作,因为我实际上是在重新启动该服务。 您可能可以删除“睡眠”,但是我不介意将其保留。 您可能可以删除所有内容,而只需使用$ stopped变量。 :)
# change to Stopped if you want to wait for services to start
$running = "Running"
$stopPending = "StopPending"
$stopped = "Stopped"
do
{
$count1 = (Get-Service $service | ? {$_.status -eq $running}).count
sleep -Milliseconds 600
$count2 = (Get-Service $service | ? {$_.status -eq $stopPending}).count
sleep -Milliseconds 600
$count3 = (Get-Service $service | ? {$_.status -eq $stopped}).count
sleep -Milliseconds 600
} until ($count1 -eq 0 -and $count2 -eq 0 -and $count3 -eq 1)
答案 4 :(得分:0)
在我的 Azure 构建/部署管道中,我像这样使用它来启动和停止服务(之前已经异步发送了“停止”命令之后)并且适用于所有过渡状态,例如 Starting
、{{1 }}、Stopping
和 Pausing
(在状态枚举 ServiceControllerStatus
中分别称为 Resuming
、StartPending
、StopPending
和 PausePending
).
ContinuePending
这需要传统的 powershell 才能在远程服务器上运行,# Wait for services to be stopped or stop them
$ServicesToStop | ForEach-Object {
$MyService = Get-Service -Name $_ -ComputerName $Server;
while ($MyService.Status.ToString().EndsWith('Pending')) {
Start-Sleep -Seconds 5;
$MyService.Refresh();
};
$MyService | Stop-Service -WarningAction:SilentlyContinue;
$MyService.Dispose();
};
的 cmdlet 不包含参数 pwsh.exe
。
在我看来,不需要计数器,因为只有过渡状态会导致 cmdlet 失败,并且它们在不久的将来无论如何都会更改为受支持的状态之一(-ComputerName
命令最多 125 秒)。