工作完成后如何做某事

How to do something if a job has finished

我正在尝试为我的 PowerShell 脚本实现一个 GUI,以简化其他用户的特定流程。我有以下 PowerShell 脚本:

if ($checkBox1.Checked)    { 
    Try{
    Start-Job { & K:\sample\adp.cmd }
    $listBox1.Items.Add("ADP-Job started...")
    }catch [System.Exception]{
    $listBox1.Items.Add("ADP --> .cmd File not found!")}
    }

    if ($checkBox2.Checked)    { 
    Try{ 
    Start-Job { & K:\sample\kdp.cmd }
    $listBox1.Items.Add("KDP-Job started...")
    }catch [System.Exception]{
    $listBox1.Items.Add("KDP --> .cmd File not found!")}
    }

有没有办法持续检查所有 运行 作业并为每个已完成的作业做些什么?例如在我的列表框中打印出这样的东西:ADP-Files have been uploaded

由于每个作业大约需要 5 分钟 - 4 小时,我想到了一个 while 循环,它每 5 分钟检查一次作业是否完成,但我无法弄清楚如何区分每个作业以执行特定的操作。

您可以使用 -Name 参数为作业指定一个名称:

Start-Job { Write-Host "hello"} -Name "HelloWriter"

并使用 Get-Job cmdlet 接收作业状态:

Get-Job -Name HelloWriter

输出:

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
3      HelloWriter     BackgroundJob   Completed     True            localhost             Write-Host "hello"

或者您将 Start-Job cmdlet 分配给一个变量并使用它来检索作业:

$worldJob = Start-Job { Write-Host "world"}

所以你可以只写 $woldJob 并接收:

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
7      Job7            BackgroundJob   Completed     True            localhost             Write-Host "world" 

您也不必轮询作业状态。而是使用 Register-ObjectEvent cmdlet 在作业完成时收到通知:

$job = Start-Job { Sleep 3; } -Name "HelloJob"

$jobEvent = Register-ObjectEvent $job StateChanged -Action {
    Write-Host ('Job #{0} ({1}) complete.' -f $sender.Id, $sender.Name)
    $jobEvent | Unregister-Event
}

这里有多种可能的方式:

$Var = Start-Job { & K:\sample\kdp.cmd }

然后检查

$Var.State

或为作业命名

Start-Job { & K:\sample\kdp.cmd } -Name MyJob

然后检查

Get-Job MyJob