如果工作完成,该怎么做

时间:2016-08-12 07:18:28

标签: powershell jobs

我正在尝试为我的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个小时我想到了一个循环,如果作业完成,每5分钟检查一次,但我无法弄清楚如何区分每个作业以执行特定的操作。< / p>

2 个答案:

答案 0 :(得分:11)

您可以使用-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
}

答案 1 :(得分:3)

这里有多种可能的方式:

$ perl -E 'say "Val: ", ("a", "b", "c")'
Val: abc
~$ perl -E 'say "Val: " . join("-", ("a", "b", "c"))'
Val: a-b-c

然后检查

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

或者给这份工作命名

$Var.State

然后检查

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