我正在尝试为我的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>
答案 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