You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让PowerShell自定义函数Wait-UntilJobFailOrSuccess接收管道输入

嘿,这事儿好办!我给你写一个完全支持管道输入的Wait-UntilJobFailOrSuccess函数,完美适配Get-Job | Wait-UntilJobFailOrSuccess的调用方式,直接看代码和细节解释:

完整实现代码
function Wait-UntilJobFailOrSuccess {
    [CmdletBinding()]
    param (
        [Parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [System.Management.Automation.Job[]]$Job
    )

    process {
        foreach ($currentJob in $Job) {
            # 阻塞等待作业进入终止状态(成功/失败/停止等)
            $currentJob | Wait-Job -Wait

            # 输出作业的关键信息,方便后续处理(可按需修改或移除)
            [PSCustomObject]@{
                JobId     = $currentJob.Id
                JobName   = $currentJob.Name
                JobState  = $currentJob.State
                JobResult = if ($currentJob.State -eq 'Completed') { $currentJob | Receive-Job } else { $null }
            }
        }
    }
}
关键实现要点
  • 管道绑定适配:参数$Job指定了类型[System.Management.Automation.Job[]],配合你已经配置的ValueFromPipeline和ValueFromPipelineByPropertyName,PowerShell会自动把Get-Job输出的Job对象绑定到这个参数,不管是单个还是多个Job都能处理。
  • Process块的核心作用:必须用process块而不是只写在end块里,因为管道是逐条传递对象的,process块会针对每个传入的Job单独执行等待逻辑,确保所有管道过来的Job都被处理到。
  • 等待逻辑的合理性:用Wait-Job -Wait来阻塞执行,这个命令本身就会等待作业进入终止状态(包括Completed成功、Failed失败、Stopped停止等),完全符合你“等待失败或成功”的需求。
  • 自定义输出(可选):代码里加了自定义对象输出,能直观展示每个Job的ID、名称、最终状态和成功时的结果,如果不需要可以直接返回$currentJob,或者删掉输出部分只做等待。
使用示例

先启动几个测试Job:

# 启动一个2秒后成功的Job
Start-Job -ScriptBlock { Start-Sleep 2; return "任务完成!" } -Name "SuccessTask"

# 启动一个3秒后失败的Job
Start-Job -ScriptBlock { Start-Sleep 3; throw "执行出错了!" } -Name "FailTask"

然后用管道调用函数:

Get-Job | Wait-UntilJobFailOrSuccess

输出效果大概是这样:

JobId JobName   JobState  JobResult
----- --------  --------  ---------
1     SuccessTask Completed 任务完成!
2     FailTask   Failed

内容的提问来源于stack exchange,提问作者Vipin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:32:51