about_Jobs
Kort beskrivning
Innehåller information om hur PowerShell-bakgrundsjobb kör ett kommando eller uttryck i bakgrunden utan att interagera med den aktuella sessionen.
Lång beskrivning
PowerShell kör samtidigt kommandon och skript via jobb. Det finns tre jobbtyper som tillhandahålls av PowerShell för att stödja samtidighet.
RemoteJob
– Kommandon och skript körs på en fjärrsession. Mer information finns i about_Remote_Jobs.BackgroundJob
– Kommandon och skript körs i en separat process på den lokala datorn.PSTaskJob
ellerThreadJob
– Kommandon och skript körs i en separat tråd i samma process på den lokala datorn. Mer information finns i about_Thread_Jobs.
Körning av skript via fjärranslutning, på en separat dator eller i en separat process, ger bra isolering. Eventuella fel som inträffar i fjärrjobbet påverkar inte andra jobb som körs eller den överordnade sessionen som startade jobbet. Dock lägger fjärrkommunikationsskiktet till omkostnader, inklusive objektserialisering. Alla objekt serialiseras och deserialiseras när de skickas mellan den överordnade sessionen och fjärrsessionen (jobbet). Serialisering av stora komplexa dataobjekt kan förbruka stora mängder beräknings- och minnesresurser och överföra stora mängder data i nätverket.
Trådbaserade jobb är inte lika robusta som fjärr- och bakgrundsjobb, eftersom de körs i samma process på olika trådar. Om ett jobb har ett kritiskt fel som kraschar processen avslutas alla andra jobb i processen.
Trådbaserade jobb kräver dock mindre omkostnader. De använder inte fjärrkommunikationsskiktet eller serialiseringen. Resultatobjekten returneras som referenser till levande objekt i den aktuella sessionen. Utan den här kostnaden körs trådbaserade jobb snabbare och använder färre resurser än de andra jobbtyperna.
Viktigt
Den överordnade sessionen som skapade jobbet övervakar också jobbstatusen och samlar in pipelinedata. Den underordnade jobbprocessen avslutas av den överordnade processen när jobbet når ett slutfört tillstånd. Om den överordnade sessionen avslutas avslutas alla underordnade jobb som körs tillsammans med deras underordnade processer.
Det finns två sätt att kringgå den här situationen:
- Använd
Invoke-Command
för att skapa jobb som körs i frånkopplade sessioner. Mer information finns i about_Remote_Jobs. - Använd
Start-Process
för att skapa en ny process i stället för ett jobb. Mer information finns i Startprocess.
Jobbets cmdletar
Start-Job
– Startar ett bakgrundsjobb på en lokal dator.Get-Job
– Hämtar bakgrundsjobben som startades i den aktuella sessionen.Receive-Job
- Hämtar resultatet av bakgrundsjobb.Stop-Job
- Stoppar ett bakgrundsjobb.Wait-Job
– Undertrycker kommandotolken tills ett eller alla jobb har slutförts.Remove-Job
– Tar bort ett bakgrundsjobb.Invoke-Command
– Parametern AsJob skapar ett bakgrundsjobb på en fjärrdator. Du kan användaInvoke-Command
för att fjärrköra valfritt jobbkommando, inklusiveStart-Job
.
Starta ett jobb på den lokala datorn
Om du vill starta ett bakgrundsjobb på den lokala datorn använder du cmdleten Start-Job
.
Om du vill skriva ett Start-Job
kommando omger du kommandot som jobbet körs i klammerparenteser ({}
). Använd parametern ScriptBlock för att ange kommandot.
Följande kommando startar ett bakgrundsjobb som kör ett Get-Process
kommando på den lokala datorn.
Start-Job -ScriptBlock {Get-Process}
När du startar ett bakgrundsjobb returnerar kommandotolken omedelbart, även om jobbet tar längre tid att slutföra. Du kan fortsätta att arbeta i sessionen utan avbrott medan jobbet körs.
Kommandot Start-Job
returnerar ett objekt som representerar jobbet. Jobbobjektet innehåller användbar information om jobbet, men det innehåller inte jobbresultatet.
Du kan spara jobbobjektet i en variabel och sedan använda det med de andra jobb-cmdletarna för att hantera bakgrundsjobbet. Följande kommando startar ett jobbobjekt och sparar det resulterande jobbobjektet i variabeln $job
.
$job = Start-Job -ScriptBlock {Get-Process}
Från och med PowerShell 6.0 kan du använda bakgrundsoperatorn (&
) i slutet av en pipeline för att starta ett bakgrundsjobb. Mer information finns i bakgrundsoperatorn.
Att använda bakgrundsoperatorn är funktionellt likvärdigt med att använda cmdleten Start-Job
i föregående exempel.
$job = Get-Process &
Hämta jobbobjekt
Cmdleten Get-Job
returnerar objekt som representerar bakgrundsjobben som startades i den aktuella sessionen. Utan parametrar Get-Job
returnerar alla jobb som startades i den aktuella sessionen.
Get-Job
Jobbobjektet innehåller jobbets tillstånd, vilket anger om jobbet har slutförts. Ett slutfört jobb har statusen Slutförd eller Misslyckad. Ett jobb kan också vara Blockerat eller Körs.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
Du kan spara jobbobjektet i en variabel och använda det för att representera jobbet i ett senare kommando. Följande kommando hämtar jobbet med ID 1 och sparar det i variabeln $job
.
$job = Get-Job -Id 1
Hämta resultatet av ett jobb
När du kör ett bakgrundsjobb visas inte resultatet omedelbart. Använd cmdleten för Receive-Job
att hämta resultatet av ett bakgrundsjobb.
I följande exempel Receive-Job
hämtar cmdleten resultatet av jobbet med hjälp av jobbobjektet i variabeln $job
.
Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
...
Du kan spara resultatet av ett jobb i en variabel. Följande kommando sparar resultatet av jobbet i variabeln $job
till variabeln $results
.
$results = Receive-Job -Job $job
Hämta och behålla partiella jobbresultat
Cmdleten Receive-Job
hämtar resultatet av ett bakgrundsjobb. Om jobbet är klart Receive-Job
hämtar du alla jobbresultat. Om jobbet fortfarande körs Receive-Job
hämtar du de resultat som har genererats hittills. Du kan köra Receive-Job
kommandon igen för att få återstående resultat.
Som standard Receive-Job
tar bort resultatet från cachen där jobbresultat lagras. När du kör Receive-Job
igen får du bara de nya resultaten som kom efter den första körningen.
Följande kommandon visar resultatet av Receive-Job
kommandon som körs innan jobbet har slutförts.
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Använd parametern Behåll för att förhindra Receive-Job
att jobbresultaten som returneras tas bort. Följande kommandon visar effekten av att använda parametern Behåll för ett jobb som ännu inte har slutförts.
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Väntar på resultatet
Om du kör ett kommando som tar lång tid att slutföra kan du använda egenskaperna för jobbobjektet för att avgöra när jobbet är klart. Följande kommando använder objektet Get-Job
för att hämta alla bakgrundsjobb i den aktuella sessionen.
Get-Job
Resultatet visas i en tabell. Jobbets status visas i kolumnen Tillstånd .
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
I det här fallet visar egenskapen State att jobb 2 fortfarande körs. Om du skulle använda cmdleten Receive-Job
för att hämta jobbresultatet nu skulle resultatet vara ofullständigt. Du kan använda cmdleten Receive-Job
upprepade gånger för att hämta alla resultat. Använd egenskapen State för att avgöra när jobbet är klart.
Du kan också använda parametern Vänta för cmdleten Receive-Job
. När du använder den här parametern returnerar cmdleten inte kommandotolken förrän jobbet har slutförts och alla resultat är tillgängliga.
Du kan också använda cmdleten Wait-Job
för att vänta på alla eller alla resultat av jobbet. Wait-Job
låter dig vänta på ett eller flera specifika jobb eller för alla jobb.
Följande kommando använder cmdleten Wait-Job
för att vänta på ett jobb med ID 10.
Wait-Job -ID 10
Därför ignoreras PowerShell-prompten tills jobbet har slutförts.
Du kan också vänta på en förutbestämd tidsperiod. Det här kommandot använder timeout-parametern för att begränsa väntetiden till 120 sekunder. När tiden går ut returneras kommandotolken, men jobbet fortsätter att köras i bakgrunden.
Wait-Job -ID 10 -Timeout 120
Stoppa ett jobb
Om du vill stoppa ett bakgrundsjobb använder du cmdleten Stop-Job
. Följande kommando startar ett jobb för att hämta varje post i systemhändelseloggen. Jobbobjektet sparas i variabeln $job
.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
Följande kommando stoppar jobbet. Den använder en pipelineoperator (|
) för att skicka jobbet i variabeln $job
till Stop-Job
.
$job | Stop-Job
Ta bort ett jobb
Om du vill ta bort ett bakgrundsjobb använder du cmdleten Remove-Job
. Följande kommando tar bort jobbet i variabeln $job
.
Remove-Job -Job $job
Undersöka ett misslyckat jobb
Jobb kan misslyckas av många orsaker. jobbobjektet innehåller en reason-egenskap som innehåller information om orsaken till felet.
I följande exempel startar ett jobb utan de nödvändiga autentiseringsuppgifterna.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Granska egenskapen Reason för att hitta felet som gjorde att jobbet misslyckades.
$job.ChildJobs[0].JobStateInfo.Reason
I det här fallet misslyckades jobbet eftersom fjärrdatorn krävde explicita autentiseringsuppgifter för att köra kommandot. Egenskapen Reason innehåller följande meddelande:
Det gick inte att ansluta till fjärrservern med följande felmeddelande: "Åtkomst nekas".