This post serves more as a reference that an introduction to Powershell Jobs.
- Cmdlets are: Get-Job, Receive-Job, Remove-Job, Resume-Job, Start-Job, Stop-Job , Suspend-Job and Wait-Job
but other commands have -AsJob parameters (Get-WMIObject, Invoke-Command, CDXML snippets) - Help can be found in the following topics:
- about_Jobs
- about_Job_Details
- about_Remote_Jobs
- about_Scheduled_Jobs
- about_Scheduled_Jobs_Advanced
- about_Scheduled_Jobs_Basics
- about_Scheduled_Jobs_Troubleshooting
- Suspend-Job and Resume-Job are only available with workflows
- Receive-Job deletes the data it sends to you except if you use -Keep as a parameter
- PSJobTypeName can be
- BackgroundJob (regular Start-Job),
- WMIJob (Get-WmiObject -AsJob),
- CimJob (use CDXML files, not Get-CimInstance),
- PSScheduledJob (Register-ScheduledJob)
- PSWorkflowJob (nameofmyworkflow -AsJob)
- As a job is run in another Windows Powershell process than yours, you cannot use it with cmdlets such as Register-WMIEvent
- Start-Job runs the command locally (but that command may perform remote connections), whereas Invoke-Command runs the command remotely and you get the response back.
- If you use parameter(s), you must use ArgumentList to pass them around as jobs are run in separate Powershell instances and processes (unsecapp for Get-WMIObject, wsmprovhost for Invoke-Command)
- Sessions (via Enter-PSSession or New-PSSession) are a way to maintain that remote connection when you have multiple script blocks to run on a target machine
- ScheduledTasks is a CDXML (WMI Wrapper) module about the TaskScheduler, whereas PSScheduledJob manages the Powershell Scheduled Jobs which are… tasks found under \Microsoft\Windows\Powershell\ScheduledJobs
- ScheduledJobs are primarily maintained with Register-ScheduledJob, but to work with result you must import explicitly the module and you can only see the jobs that you create/manage in your context whose results are stored in %AppData%\Local\Microsoft\Windows\Powershell\ScheduledJobs\<JobName>\Output
- If you run jobs inside workflows, you lose the result because they are still run in an external process to yours
- Some snippets:
12345678910111213141516171819202122# SimpleStart-Job -ScriptBlock { ... some action ...} -Name MySupremeJobGet-Job -Name MySupremeJob | select PSBeginTime, PSEndTime, @{Name='Duration';Expression={$_.PSEndTime-$_.PSBeginTime}}# with parameterStart-Job -Scriptblock {param([string]$data) Get-Service -Name $data} -ArgumentList $data#WMI Method$stuckjava = Get-WMIObject -Class Win32_Process -Filter "Name='javaw.exe'"Invoke-WmiMethod -InputObject $stuckjava -Name Terminate -AsJob# ScheduledJOb$everyday = New-JobTrigger -Daily -At "23:59"$god=New-ScheduledOption -RunElevatedRegister-ScheduledJob -Name RebootMe -ScritpBlock {Restart-Computer} -Trigger $everyday -ScheduledJobOption $god#workflowsworkflow donothing { Start-Sleep -Seconds 60; Suspend-Workflow; Write-Host "Waking up myself" } #auto-suspendworkflow stilldonothing { Start-Sleep -Seconds 60; Checkpoint-Workflow; Write-Host "Waked up" } #suspend the job from elsewhere#Remote Sessions launching jobs$faraway = New-PSSession -ComputerName mydistantpcInvoke-Command -Session $faraway -ScriptBlock {Start-Job -Name WhichSvc -Scriptblock { Get-Service } }Invoke-Command -Session $faraway -ScriptBlock {Receive-Job -Name WhichSvc -Keep }Invoke-Command -Session $faraway -ScriptBlock {Get-Job | Remove-Job }$faraway | Remove-PSSession