PowerShell Wait-Job
最后修改:2025 年 2 月 15 日
在本文中,我们将介绍 PowerShell 中的 Wait-Job
cmdlet。此 cmdlet 会暂停执行,直到后台作业完成。它对于作业管理和同步至关重要。
作业基础
PowerShell 作业代表一个独立运行的后台任务。作业允许命令并行执行,而不会阻塞控制台。每个作业都有一个状态(运行中、已完成、失败)和输出数据。Wait-Job
cmdlet 会暂停执行,直到指定的作业完成。
Wait-Job 的基本用法
使用 Wait-Job
的最简单方法是配合作业对象。这会暂停脚本,直到作业完成。完成后,cmdlet 会返回作业对象。基本用法不需要任何参数。
$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 5 } Wait-Job $job
此脚本启动一个休眠 5 秒的后台作业。Wait-Job
会暂停执行,直到作业完成。在等待期间,控制台仍然响应。
等待多个作业
Wait-Job
可以接受多个作业对象作为输入。它会一直等待,直到所有指定的作业都完成。作业可以通过数组或管道传递。这对于并行任务很有用。
$job1 = Start-Job -ScriptBlock { Start-Sleep -Seconds 3 } $job2 = Start-Job -ScriptBlock { Start-Sleep -Seconds 5 } Wait-Job $job1, $job2
此示例启动两个具有不同休眠时长的作业。Wait-Job
会等待两者都完成后再继续。总等待时间取决于运行时间最长的作业。
-Timeout 参数
-Timeout
参数限制等待作业的时间。如果在超时时间内作业未完成,执行将继续。该值以秒为单位指定。这可以防止无限期阻塞。
$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 10 } Wait-Job $job -Timeout 5
此脚本启动一个 10 秒的作业,但只等待 5 秒。超时后,作业将继续在后台运行。cmdlet 会在 5 秒后将控制权返回给脚本。
等待任何作业完成
-Any
参数使 Wait-Job
在任何指定作业完成后立即返回。这对于需要第一个可用结果的场景很有用。其他作业将继续运行。
$job1 = Start-Job -ScriptBlock { Start-Sleep -Seconds 3 } $job2 = Start-Job -ScriptBlock { Start-Sleep -Seconds 5 } Wait-Job $job1, $job2 -Any
此示例等待其中一个作业完成。cmdlet 在 3 秒后,当第一个作业完成时返回。第二个作业继续在后台运行。
管道输入
Wait-Job
通过管道接受作业对象。这允许与其他作业相关的 cmdlet 链式调用。在处理多个作业时,管道输入的语法更简洁。管道输入与参数输入以相同方式处理。
Get-Job | Wait-Job
此命令等待所有当前作业完成。Get-Job
检索所有作业对象,并将它们通过管道传递给 Wait-Job
。这对于批量处理很方便。
等待后检索作业结果
等待作业完成后,通常需要检索结果。使用 Receive-Job
来获取已完成作业的输出。这应该在 Wait-Job
确认完成之后进行。
$job = Start-Job -ScriptBlock { Get-Process } Wait-Job $job Receive-Job $job
此脚本启动一个获取进程的作业,等待其完成,然后检索结果。输出与直接运行 Get-Process
相同,但它是后台执行的。
错误处理
等待后可以检测到失败的作业。检查作业的 State
属性是否为“Failed”。Error
属性包含失败的详细信息。这允许在脚本中进行适当的错误处理。
$job = Start-Job -ScriptBlock { Get-Item "nonexistent.txt" } Wait-Job $job if ($job.State -eq "Failed") { $job.Error }
此示例尝试在作业中访问不存在的文件。等待后,它会检查是否失败并显示错误。错误消息解释了作业失败的原因。
等待远程作业
Wait-Job
可用于在远程计算机上运行的作业。必须使用 -AsJob
参数配合 Invoke-Command
来启动作业。等待行为与本地作业相同。
$job = Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Process } -AsJob Wait-Job $job Receive-Job $job
此脚本在远程计算机上运行 Get-Process
。Wait-Job
会暂停,直到远程作业完成。然后检索结果并在本地显示。
来源
在本文中,我们介绍了 PowerShell 中的 Wait-Job cmdlet。
作者
列出 所有 PowerShell 教程。