windows - 以 Start-Job 开始的 PowerShell 作业的事件名称

标签 windows powershell start-job powershell-jobs

我想在 PowerShell 作业成功完成时运行脚本。但是,如何找出使用 Start-Job cmdlet 启动的作业的所有可能事件?

这是一个例子:

$myjob = Start-Job { Get-ChildItem }

$jobEvent = Register-ObjectEvent -InputObject $myjob -EventName StateChanged -Action {
    Write-Host 'Job has completed'
}

因此,从 Stack Overflow 上的其他一些示例中,我知道存在 StateChanged 事件,但它仅表明作业的状态已更改。是否有任何事件表明作业已失败或成功完成?

如何获取此类事件的列表?除了StateChanged之外还有其他事件吗?

或者代码是否必须在收到 StateChanged 事件后使用 Get-Job 检查作业以确定作业的实际状态?

最佳答案

StateChanged是您可以订阅 Job Class 的唯一事件,但这对于您想要实现的目标来说已经足够了。

在事件的 Action block 中,有不同的自动变量会在事件触发时自动填充:$Event$EventArgs$args$EventSubscriber$Sender 您可以使用它们来确定您的作业是否成功完成。请参阅about Automatic Variables了解更多详情。

在这种情况下,我相信您可以使用 JobState.State Property从你的工作中检查它是否等于 Completed 。您还可以检查 .Reason 属性,以防失败,尽管该属性可能并不总是被填充。

$jobEvent = Register-ObjectEvent -InputObject $myjob -EventName StateChanged -Action {
    switch($EventArgs.JobStateInfo.State) {
        Completed { Write-Host ('Job [{0}] completed successfully.' -f $sender.InstanceId) -ForegroundColor Green }
        Failed { Write-Host ('Job [{0}] failed.' -f $sender.InstanceId) -ForegroundColor Red }
        Default { <# something else here, enum has many possible states #> }
    }
}

关于windows - 以 Start-Job 开始的 PowerShell 作业的事件名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75277681/

相关文章:

windows - WinUSB 在非开发计算机上失败

.net - 为什么PS抓不到: "New-PSDrive : Logon failure: unknown user (...)"?

windows - 如何在维持当前 session 状态的同时在Windows命令中使用Start-Job

c++ - 多次内存映射同一个文件?

python - 在 Jupyter 笔记本中创建新笔记本时出错 [权限被拒绝]

c++ - 使用 freeglut 在 Windows 10 上出现 glDebugMessageCallback 问题

powershell - 使用PowerShell获取流程位置路径

xml - 将CSV文件转换为适当的XML格式

powershell - 我可以将PowerShell 'Start-Job'设置为低优先级吗?

powershell - 使用 powershell 对象执行脚本