about_Job_Details
Kort beskrivning
Innehåller information om bakgrundsjobb på lokala datorer och fjärrdatorer.
Detaljerad beskrivning
I det här avsnittet beskrivs begreppet bakgrundsjobb och teknisk information om hur bakgrundsjobb fungerar i PowerShell.
Det här avsnittet är ett tillägg till ämnena about_Jobs, about_Thread_Jobs och about_Remote_Jobs .
Om bakgrundsjobb
Ett bakgrundsjobb kör ett kommando eller uttryck asynkront. Den kan köra en cmdlet, en funktion, ett skript eller någon annan kommandobaserad uppgift. Den är utformad för att köra kommandon som tar en längre tid, men du kan använda den för att köra valfritt kommando i bakgrunden.
När ett synkront kommando körs ignoreras PowerShell-kommandotolken tills kommandot är klart. Men ett bakgrundsjobb undertrycker inte PowerShell-prompten. Ett kommando för att starta ett bakgrundsjobb returnerar ett jobbobjekt. Kommandotolken returneras omedelbart så att du kan arbeta med andra aktiviteter medan bakgrundsjobbet körs.
Men när du startar ett bakgrundsjobb får du inte resultatet direkt även om jobbet körs mycket snabbt. Jobbobjektet som returneras innehåller användbar information om jobbet, men det innehåller inte jobbresultatet. Du måste köra ett separat kommando för att få jobbresultatet. Du kan också köra kommandon för att stoppa jobbet, vänta tills jobbet har slutförts och ta bort jobbet.
För att göra tidpunkten för ett bakgrundsjobb oberoende av andra kommandon körs varje bakgrundsjobb i sin egen PowerShell-session. Detta kan dock vara en tillfällig anslutning som bara skapas för att köra jobbet och sedan förstörs, eller så kan det vara en beständig PSSession som du kan använda för att köra flera relaterade jobb eller kommandon.
Använda jobb-cmdletar
Använd ett Start-Job
kommando för att starta ett bakgrundsjobb på en lokal dator.
Start-Job
returnerar ett jobbobjekt. Du kan också hämta objekt som representerar jobben som startades på den lokala datorn med hjälp av cmdleten Get-Job
.
Använd ett Receive-Job
kommando för att hämta jobbresultatet. Om jobbet inte är klart Receive-Job
returnerar du partiella resultat. Du kan också använda cmdleten Wait-Job
för att ignorera kommandotolken tills ett eller alla jobb som startades i sessionen har slutförts.
Om du vill stoppa ett bakgrundsjobb använder du cmdleten Stop-Job
. Om du vill ta bort ett jobb använder du cmdleten Remove-Job
.
Mer information om hur cmdletarna fungerar finns i hjälpavsnittet för varje cmdlet och se about_Jobs.
Starta bakgrundsjobb på fjärrdatorer
Du kan skapa och hantera bakgrundsjobb på en lokal eller fjärransluten dator. Om du vill fjärrköra ett bakgrundsjobb använder du asjob-parametern för en cmdlet, till exempel Invoke-Command
, eller använder cmdleten Invoke-Command
för att köra ett Start-Job
kommando via fjärranslutning. Du kan också starta ett bakgrundsjobb i en interaktiv session.
Mer information om fjärrbakgrundsjobb finns i about_Remote_Jobs.
Underordnade jobb
Varje bakgrundsjobb består av ett överordnat jobb och ett eller flera underordnade jobb. I jobb som startats med hjälp Start-Job
av eller asjob-parametern för Invoke-Command
är det överordnade jobbet en chef. Den kör inga kommandon eller returnerar inga resultat. Kommandona körs faktiskt av de underordnade jobben. Jobb som har startats med andra cmdletar kan fungera annorlunda.
De underordnade jobben lagras i egenskapen ChildJobs för det överordnade jobbobjektet. Egenskapen ChildJobs kan innehålla ett eller flera underordnade jobbobjekt. De underordnade jobbobjekten har ett Namn, ID och InstanceId som skiljer sig från det överordnade jobbet så att du kan hantera de överordnade och underordnade jobben individuellt eller som en enhet.
Om du vill hämta överordnade och underordnade jobb för ett jobb använder du parametern IncludeChildJobs för cmdleten Get-Job
. Parametern IncludeChildJob introducerades i Windows PowerShell 3.0.
PS> Get-Job -IncludeChildJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Failed True localhost Get-Process
2 Job2 Completed True Server01 Get-Process
3 Job3 Failed False localhost Get-Process
Om du vill hämta det överordnade jobbet och endast de underordnade jobben med ett visst tillståndsvärde använder du parametern ChildJobState för cmdleten Get-Job
. Parametern ChildJobState introducerades i Windows PowerShell 3.0.
PS> Get-Job -ChildJobState Failed
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Failed True localhost Get-Process
3 Job3 Failed False localhost Get-Process
Om du vill hämta underordnade jobb för ett jobb i alla versioner av PowerShell använder du egenskapen ChildJob för det överordnade jobbet.
PS> (Get-Job Job1).ChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 Completed True Server01 Get-Process
3 Job3 Failed False localhost Get-Process
Du kan också använda ett Get-Job
kommando för det underordnade jobbet, som du ser i följande kommando:
PS> Get-Job Job3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 Failed False localhost Get-Process
Konfigurationen av det underordnade jobbet beror på det kommando som du använder för att starta jobbet.
När du använder
Start-Job
för att starta ett jobb på en lokal dator består jobbet av ett överordnat chefsjobb och ett underordnat jobb som kör kommandot.När du använder asjob-parametern
Invoke-Command
för för att starta ett jobb på en eller flera datorer består jobbet av ett överordnat chefsjobb och ett underordnat jobb för varje jobb som körs på varje dator.När du använder
Invoke-Command
för att köra ettStart-Job
kommando på en eller flera fjärrdatorer blir resultatet detsamma som en lokal kommandokörning på varje fjärrdator. Kommandot returnerar ett jobbobjekt för varje dator. Jobbobjektet består av ett överordnat chefsjobb och ett underordnat jobb som kör kommandot.
Det överordnade jobbet representerar alla underordnade jobb. När du hanterar ett överordnat jobb hanterar du även associerade underordnade jobb. Om du till exempel stoppar ett överordnat jobb stoppas alla underordnade jobb. Om du får resultatet av ett överordnat jobb får du resultatet av alla underordnade jobb.
Men du kan också hantera underordnade jobb individuellt. Detta är mest användbart när du vill undersöka ett problem med ett jobb eller få resultatet av endast ett av ett antal underordnade jobb som startats med hjälp av asjob-parametern för Invoke-Command
.
Följande kommando använder asjob-parametern Invoke-Command
för för att starta bakgrundsjobb på den lokala datorn och två fjärrdatorer. Kommandot sparar jobbet i variabeln $j
.
PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob
När du visar egenskaperna Namn och Underordnat jobb i $j
visar det att kommandot returnerade ett jobbobjekt med tre underordnade jobb, ett för varje dator.
PS> $j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
När du visar det överordnade jobbet visas att jobbet misslyckades.
PS> $j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
Men när du kör ett Get-Job
kommando som hämtar de underordnade jobben visar utdata att endast ett underordnat jobb misslyckades.
PS> Get-Job -IncludeChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 RemotingJob Failed False localhost,Server...
4 Job4 Completed True localhost Get-Date
5 Job5 Failed False Server01 Get-Date
6 Job6 Completed True Server02 Get-Date
Om du vill få resultatet av alla underordnade jobb använder du cmdleten Receive-Job
för att hämta resultatet av det överordnade jobbet. Men du kan också få resultatet av ett visst underordnat jobb, som du ser i följande kommando.
PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
Funktionen för underordnade jobb i PowerShell-bakgrundsjobb ger dig mer kontroll över de jobb som du kör.
Jobbtyper
PowerShell stöder olika typer av jobb för olika uppgifter. Från och med Windows PowerShell 3.0 kan utvecklare skriva "jobbkällkort" som lägger till nya jobbtyper i PowerShell och inkluderar jobbkällkorten i moduler. När du importerar modulen kan du använda den nya jobbtypen i sessionen.
Till exempel lägger MODULen PSScheduledJob till schemalagda jobb och PSWorkflow-modulen lägger till arbetsflödesjobb.
Anpassade jobbtyper kan skilja sig avsevärt från vanliga PowerShell-bakgrundsjobb. Till exempel sparas schemalagda jobb på disk. de finns inte bara i en viss session. Arbetsflödesjobb kan pausas och återupptas.
Vilka cmdletar du använder för att hantera anpassade jobb beror på jobbtypen. För vissa använder du standardjobb-cmdletar, till exempel Get-Job
och Start-Job
. Andra levereras med specialiserade cmdletar som endast hanterar en viss typ av jobb. Detaljerad information om anpassade jobbtyper finns i hjälpavsnitten om jobbtypen.
Om du vill hitta jobbtypen för ett jobb använder du cmdleten Get-Job
. Get-Job
returnerar olika jobbobjekt för olika typer av jobb. Värdet för egenskapen PSJobTypeName för jobbobjekten som Get-Job
returnerar anger jobbtypen.
I följande tabell visas de jobbtyper som medföljer PowerShell.
Jobbtyp | beskrivning |
---|---|
Bakgrundsjobb | Började använda cmdleten Start-Job . |
Fjärrjobb | Började använda AsJob-parametern för |
Invoke-Command cmdlet. |
|
PSWorkflowJob | Började använda asjob-parametern för ett arbetsflöde. |
PSScheduledJob | En instans av ett schemalagt jobb som startats av en jobbutlösare. |
CIMJob | Började använda AsJob-parametern för en cmdlet från en |
CDXML-modul. | |
WMI-jobb | Började använda AsJob-parametern för en cmdlet från en |
WMI-modul. | |
PSEventJob | Skapas med ochRegister-ObjectEvent anger en |
åtgärd med parametern Åtgärd . |
Obs! Innan du använder cmdleten Get-Job
för att hämta jobb av en viss typ kontrollerar du att modulen som lägger till jobbtypen importeras till den aktuella sessionen.
Annars Get-Job
får inte jobb av den typen.
Exempel
Följande kommandon skapar ett lokalt bakgrundsjobb, ett fjärrbakgrundsjobb, ett arbetsflödesjobb och ett schemalagt jobb. Sedan använder den cmdleten Get-Job
för att hämta jobben. Get-Job
hämtar inte det schemalagda jobbet, men det hämtar alla startinstanser av det schemalagda jobbet.
Starta ett bakgrundsjobb på den lokala datorn.
PS> Start-Job -Name LocalData {Get-Process}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Running True localhost Get-Process
Starta ett bakgrundsjobb som körs på en fjärrdator.
PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process
Skapa ett schemalagt jobb
PS> Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
{Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True
Skapa ett arbetsflöde.
PS> workflow Test-Workflow {Get-Process}
Kör arbetsflödet som ett jobb.
PS> Test-Workflow -AsJob -JobName TestWFJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 TestWFJob PSWorkflowJob NotStarted True localhost Get-Process
Hämta jobben. Kommandot Get-Job
hämtar inte schemalagda jobb, men hämtar instanser av det schemalagda jobbet som startas.
PS> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 LocalData BackgroundJob Completed True localhost Get-Process
4 RemoteData RemoteJob Completed True Server01 Get-Process
6 TestWFJob PSWorkflowJob Completed True localhost WorkflowJob
8 ScheduledJob PSScheduledJob Completed True localhost Get-Process
Använd cmdleten för Get-ScheduledJob
att hämta schemalagda jobb.
PS> Get-ScheduledJob
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True