首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PowerShell:在多个作业完成之前执行/直到循环

PowerShell:在多个作业完成之前执行/直到循环
EN

Stack Overflow用户
提问于 2022-10-12 13:48:34
回答 1查看 41关注 0票数 0

早安的人,

我正在处理一个Do/Until循环,该循环跟踪针对多个服务器的invoke-command作业。我不知道如何在Until块中捕获的是继续执行循环,直到所有服务器都报告了Completed状态。

下面是我的测试代码

代码语言:javascript
运行
复制
Invoke-Command -ComputerName Server01,Server02,Server03 -ScriptBlock{sleep -s 120} -AsJob -JobName "Test Job"

Do{
Write-Host "Job is still running"
sleep -s 10
}Until((Get-Job "Test Job").state -eq "Completed"

我在想,我需要把下面的内容放在“直到”块中,但我不确定

代码语言:javascript
运行
复制
Until(ForEach($job in (Get-Job "Test Job")){
$Job.State -eq "Completed"
})
EN

回答 1

Stack Overflow用户

发布于 2022-10-12 16:22:37

我目前还没有办法测试这个,但是如果你想要的是一个进度输出,我不明白为什么这个结果不能工作。

代码语言:javascript
运行
复制
$jobs = Invoke-Command -ComputerName Server01,Server02,Server03 -ScriptBlock{sleep -s 120} -AsJob
do {
    foreach ($job in ($jobs.ChildJobs | ? 'State' -EQ 'Running')
    {
        Write-Host -Object (
            "Job {0} is still running on computer {1}." -f $job.Name, $job.Location
        )
    }
    Start-Sleep -Seconds 1
} until ($jobs.ChildJobs.State -notcontains 'Running')

如前所述,我没有办法测试这一点,也不记得您从父作业中获得的State属性是否考虑到了运行的子作业。从技术上讲,你所尝试的也是一样的,因为它有结束括号。

代码语言:javascript
运行
复制
Do{
Write-Host "Job is still running"
sleep -s 10
}Until((Get-Job "Test Job").state -eq "Completed")

我没有解释您可能遇到的每一个问题,但您可能担心的一件事是, state 属性可能并不总是处于“已完成”或“运行”状态。这可能导致对“已完成”状态的无限期循环测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74043002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档