PowerShell:如何收集Do/Until循环运行任务数并等待所有远程计划任务完成
解决方案
一、修正循环终止逻辑,等待所有任务完成
原循环的Until条件存在逻辑漏洞:只要有一台服务器的任务状态不为Running,条件就会返回$true,导致循环提前结束。要实现等待所有任务终止,需要确保所有服务器的任务状态中不再包含Running。
二、统计当前运行的任务数量
在循环内部,每次查询任务状态后,统计State为Running的任务条目数即可。
修改后的完整代码
$StartTime = Get-Date Do{ $ElapsedTime = (Get-Date) - $StartTime $TotalTime = "{0:HH:mm:ss}" -f ([datetime]$ElapsedTime.Ticks) # 获取所有远程服务器的任务状态 $taskStates = Get-ScheduledTask -CimSession $CimSessions -TaskName "<Task-Name>" | Select-Object -ExpandProperty State # 统计处于运行状态的任务数量 $runningTaskCount = ($taskStates | Where-Object { $_ -eq 'Running' }).Count # 更新输出内容,显示运行中任务数 $CurrentLine = $host.UI.RawUI.CursorPosition Write-Output "Running Scheduled Task... [Total Elapsed Time: $(stc $TotalTime yellow)] | 运行中任务数量: $(stc $runningTaskCount cyan)" Start-Sleep -Seconds 2 $host.UI.RawUI.CursorPosition = $CurrentLine # 终止条件:所有任务状态均不为Running }Until($taskStates -notcontains 'Running')
关键改动说明
- 新增
$taskStates变量统一存储所有服务器的任务状态,避免重复调用Get-ScheduledTask接口 - 新增
$runningTaskCount统计当前运行中的任务数量,并在控制台输出中展示 - 将
Until条件改为$taskStates -notcontains 'Running',确保只有当所有任务都停止时才结束循环
内容的提问来源于stack exchange,提问作者Fitzgery
相关产品推荐
相关产品推荐

