Dela via


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.

SE ÄVEN

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command