Author Posts

January 25, 2015 at 2:46 pm

Is it possible to create a PowerShell job using start-job which will terminate itself once completed?
For example the script block would check some conditions and write the result to a log file, after which it should terminate itself (the job within which it is running).
In other words I would start many short jobs from the main script block, but I don't need to receive anything from them and I would like to avoid keeping track of them and having to use remove-job to terminate them all.

January 25, 2015 at 3:11 pm

Sort of. You can't do that from inside the job itself (because it's usually running in a different process), but you can register an event that fires when the job finishes and cleans up after itself. Here's some demo code of that:

$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 10 }
$null = Register-ObjectEvent $job -EventName StateChanged -Action {
    if ($eventArgs.JobStateInfo.State -eq [System.Management.Automation.JobState]::Completed)
    {
        Write-Host -ForegroundColor Green 'Event triggering'

        # This command removes the original job
        $sender | Remove-Job -Force

        # These commands remove the event registration
        $eventSubscriber | Unregister-Event -Force
        $eventSubscriber.Action | Remove-Job -Force
    }
}

Write-Verbose -Verbose 'Before:'

Get-Job | Out-Host

January 25, 2015 at 3:31 pm

Thank for the quick reply! One question:
what is the $sender variable?

January 25, 2015 at 3:36 pm

$sender, $eventArgs and $eventSubscriber are all automatic variables set inside the Action block of an event subscription. There are a few others as well, in the about_Automatic_Variables help file.