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 kommandon och skript samtidigt 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 eller ThreadJob – Kommandon och skript körs i en separat tråd i samma process på den lokala datorn. Mer information finns i about_Thread_Jobs.

Att köra 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. Fjärrkommunikationsskiktet lägger dock till merarbete, 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 över 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 liveobjekt i den aktuella sessionen. Utan detta arbete 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:

  1. Använd Invoke-Command för att skapa jobb som körs i frånkopplade sessioner. Mer information finns i about_Remote_Jobs.
  2. 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ända Invoke-Command för att köra valfritt jobbkommando via fjärranslutning, inklusive Start-Job.

Så här startar du 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 inom 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 returneras 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ört eller Misslyckades. 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. Om du vill hämta resultatet av ett bakgrundsjobb använder du cmdleten Receive-Job .

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 alla jobbresultat. Om jobbet fortfarande körs får Receive-Job 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 jobbresultatet som returneras tas bort. Följande kommandon visar effekten av att använda parametern Behåll på 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 har slutförts. 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 Delstat .

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 Tillstånd 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 få alla resultat. Använd egenskapen State för att avgöra när jobbet har slutförts.

Du kan också använda parametern Wait 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 jobbresultat. 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 returnerar 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".

Se även