2016-08-12 14 views
4

私は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分ごとにチェックするLoopと思ったが、どのように各ジョブを区別して何か特定のことをする。

あなたが -Nameパラメータ使用してジョブの名前をspecifiyするか

答えて

6

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

をそしてGet-Jobレット使用してジョブのステータスを受け取る:

Get-Job -Name HelloWriter 

出力:

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

それとも、変数にStart-Jobコマンドレットを割り当て、ジョブを取得するためにそれを使用する:

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

だから、あなただけの$woldJobを書いて、受け取ることができます。

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

あなたもする必要はありませんジョブの状態をポーリングします。ここ

$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 
} 
+0

ありがとうございました。だから私は私のジョブの個々の名前を与えて、Get-Job -Nameコマンドレットを使用する場合、私はジョブが完了した後、印刷するカスタムメッセージを作成することができますが、それは数時間かかりますか?それとも、完了したら5分ごとに継続的にチェックするループを作成する必要がありますか? –

+0

完了した後で仕事を自分自身に出力させることもできます –

+0

それは完璧な解決策ですが、どうすればいいでしょうか?私は.cmdファイルの後ろに書込みホストメッセージを入れてみましたが、ジョブがまだ完了していなくても、メッセージを表示するだけです。 –

2

複数の可能な方法:代わりにジョブが終了したときにnotificated取得するRegister-ObjectEventコマンドレットを使用し、その後

$Var.State 

を確認したり、ジョブに名前を付け

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

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

を確認してから

Get-Job MyJob 
関連する問題