Om jobb
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
Det här avsnittet beskriver hur du kör bakgrundsjobb i PowerShell på en lokal dator. Information om hur du kör bakgrundsjobb på fjärrdatorer finns i about_Remote_Jobs.
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.
JOBBETS CMDLETAR
Cmdlet | Beskrivning |
---|---|
Start-Job |
Startar ett bakgrundsjobb på en lokal dator. |
Get-Job |
Hämtar bakgrundsjobben som startades i |
aktuell session. | |
Receive-Job |
Hämtar resultatet av bakgrundsjobb. |
Stop-Job |
Stoppar ett bakgrundsjobb. |
Wait-Job |
Undertrycker kommandotolken tills ett eller alla jobb har |
Komplett. | |
Remove-Job |
Tar bort ett bakgrundsjobb. |
Invoke-Command |
AsJob-parametern kör alla kommandon som bakgrund |
på en fjärrdator. Du kan också använda | |
Invoke-Command för att köra valfritt jobbkommando via fjärranslutning, |
|
inklusive ett Start-Job kommando. |
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}
Kommandot Start-Job
returnerar ett objekt som representerar jobbet. Jobbobjektet innehåller användbar information om jobbet, men det innehåller inte jobbresultatet.
Spara jobbobjektet i en variabel och använd det sedan 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}
Du kan också använda cmdleten Get-Job
för att hämta objekt som representerar jobben som startades i den aktuella sessionen. Get-Job
returnerar samma jobbobjekt som Start-Job returnerar.
HÄMTA JOBBOBJEKT
Använd cmdleten för att hämta objekt som representerar bakgrundsjobben Get-Job
som startades i den aktuella sessionen. Utan parametrar Get-Job
returnerar alla jobb som startades i den aktuella sessionen.
Följande kommando hämtar till exempel jobben i den aktuella sessionen.
PS C:> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
Du kan också 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
Jobbobjektet innehåller jobbets tillstånd, vilket anger om jobbet har slutförts. Ett slutfört jobb har tillståndet "Slutfört" eller "Misslyckades". Ett jobb kan också blockeras eller köras.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
HÄMTA RESULTATET AV ETT JOBB
När du kör ett bakgrundsjobb visas inte resultatet omedelbart.
I stället returnerar Start-Job-cmdleten ett jobbobjekt som representerar jobbet, men det innehåller inte resultatet. Använd cmdleten för Receive-Job
att hämta resultatet av ett bakgrundsjobb.
Följande kommando använder cmdleten Receive-Job
för att hämta resultatet av jobbet. Det använder ett jobbobjekt som sparats i variabeln $job för att identifiera jobbet.
Receive-Job -Job $job
Cmdleten Receive-Job returnerar jobbets resultat.
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 också 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
Och du kan spara resultatet av jobbet i en fil med hjälp av omdirigeringsoperatorn (>) eller cmdleten Out-File. Följande kommando använder omdirigeringsoperatorn för att spara jobbets resultat i variabeln $job i Results.txt-filen.
Receive-Job -Job $job > results.txt
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 får Receive-Job de resultat som har genererats hittills.
Du kan köra Receive-Job
kommandon igen för att få återstående resultat.
När Receive-Job
returnerar resultat tas som standard dessa resultat bort från cachen där jobbresultat lagras. Om du kör ett annat Receive-Job
kommando får du bara de resultat som ännu inte har tagits emot.
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
Om du vill förhindra Receive-Job
att jobbresultatet som returneras tas bort använder du parametern Behåll . Receive-Job
Därför returnerar alla resultat som har genererats fram till den tiden.
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 Get-Job
objektet 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. Varje gång du använder den får du som standard bara de resultat som inte redan har tagits emot, men du kan använda parametern Behåll för cmdleten Receive-Job för att behålla resultaten, även om de redan har tagits emot.
Du kan skriva de partiella resultaten till en fil och sedan lägga till nyare resultat när de anländer, eller så kan du vänta och kontrollera jobbets tillstånd senare.
Du kan använda parametern Vänta för cmdleten Receive-Job
, som inte returnerar 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 visst jobb, för alla jobb eller för att något av jobben ska slutföras.
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. Det sparar jobbobjektet 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
Om du vill ta reda på varför ett jobb misslyckades använder du underegenskaperna Orsak för jobbobjektet.
Följande kommando startar ett jobb utan nödvändiga autentiseringsuppgifter. Det sparar jobbobjektet i variabeln $job.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Följande kommando använder egenskapen Reason för att hitta felet som orsakade 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. Värdet för egenskapen Reason är:
Det gick inte att ansluta till fjärrservern med följande felmeddelande: Åtkomst nekas.