工作完成后如何做某事
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
我正在尝试为我的 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