windows 使用Start-Job启动的PowerShell作业的事件名称

wxclj1h5  于 2023-01-31  发布在  Windows
关注(0)|答案(1)|浏览(142)

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

$myjob = Start-Job { Get-ChildItem }

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

从堆栈溢出的其他一些例子中,我知道有StateChanged事件,但它只告诉一个作业的状态发生了变化,是否有任何事件会告诉作业失败或成功完成?
如何获得此类事件的列表?除了StateChanged之外还有其他事件吗?
或者,代码是否必须在接收到StateChanged事件后使用Get-Job检查作业,以确定作业的实际状态?

yyyllmsg

yyyllmsg1#

StateChangedJob Class中您可以订阅的唯一事件,但对于您要完成的任务来说,它已经足够了。
在事件的Action块中,有不同的自动变量在事件触发时自动填充:$Event$EventArgs$args$EventSubscriber$Sender,可用于确定作业是否成功完成。有关详细信息,请参阅about Automatic Variables
在这种情况下,我认为您可以使用作业中的JobState.State属性,并检查它是否等于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 #> }
    }
}

相关问题