about_Job_Details

Kort beskrivning

Innehåller information om bakgrundsjobb på lokala datorer och fjärrdatorer.

Detaljerad beskrivning

Det här avsnittet beskriver begreppet bakgrundsjobb och ger 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 alla kommandon 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 en 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 köra ett bakgrundsjobb via en fjärranslutning använder du asjob-parametern för en cmdlet som Invoke-Command, eller använder cmdleten Invoke-Command för att köra ett Start-Job kommando via en 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 Start-Job eller asjob-parametern för Invoke-Commandär det överordnade jobbet en chef. Den kör inga kommandon eller returnerar några 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 överordnade och underordnade jobb 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 underordnade jobb 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 enligt 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å vilket kommando 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-parameternInvoke-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 ett Start-Job kommando på en eller flera fjärrdatorer blir resultatet detsamma som ett lokalt kommando som körs 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-parameternInvoke-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 för jobbet i $jvisas 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 underordnade jobb 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 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 PSScheduledJob-modulen 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å disken. 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 har specialiserade cmdletar som bara hanterar en viss typ av jobb. Detaljerad information om anpassade jobbtyper finns i hjälpavsnitten om jobbtypen.

Använd cmdleten för Get-Job att hitta jobbtypen för ett jobb. Get-Job returnerar olika jobbobjekt för olika typer av jobb. Värdet för egenskapen PSJobTypeName för jobbobjekten som Get-Job returneras anger jobbtypen.

I följande tabell visas de jobbtyper som medföljer PowerShell.

Jobbtyp Description
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.
WMIJob Började använda AsJob-parametern för en cmdlet från en
WMI-modul.
PSEventJob Skapades med hjälp avRegister-ObjectEvent och 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 det 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

Se även