about_Scheduled_Jobs_Troubleshooting

Kort beskrivning

Förklarar hur du löser problem med schemalagda jobb

Lång beskrivning

Det här dokumentet beskriver några av de problem som kan uppstå när du använder de schemalagda jobbfunktionerna i PowerShell och föreslår lösningar på dessa problem.

Innan du använder schemalagda PowerShell-jobb kan du läsa about_Scheduled_Jobs och relaterade schemalagda jobb om ämnen.

Mer information om cmdlets som finns i modulen PSScheduledJob finns i PSScheduledJob.

Det går inte att hitta jobbresultat

Grundläggande metod för att få jobbresultat i PowerShell

När ett schemalagt jobb körs skapar det en instans av det schemalagda jobbet. Om du vill visa, hantera och hämta resultatet av schemalagda jobbinstanser använder du cmdletarna Jobb.

Kommentar

Om du vill använda jobb-cmdletar på instanser av schemalagda jobb måste modulen PSScheduledJob importeras till sessionen. Om du vill importera MODULen PSScheduledJob skriver Import-Module PSScheduledJob eller använder du en schemalagd jobb-cmdlet, till exempel Get-ScheduledJob.

Om du vill hämta en lista över alla instanser av ett schemalagt jobb använder du cmdleten Get-Job .

Import-Module PSScheduledJob
Get-Job ProcessJob
Id     Name         PSJobTypeName   State         HasMoreData     Location
--     ----         -------------   -----         -----------     --------
43     ProcessJob   PSScheduledJob  Completed     False           localhost
44     ProcessJob   PSScheduledJob  Completed     False           localhost
45     ProcessJob   PSScheduledJob  Completed     False           localhost
46     ProcessJob   PSScheduledJob  Completed     False           localhost
47     ProcessJob   PSScheduledJob  Completed     False           localhost
48     ProcessJob   PSScheduledJob  Completed     False           localhost
49     ProcessJob   PSScheduledJob  Completed     False           localhost
50     ProcessJob   PSScheduledJob  Completed     False           localhost

Cmdleten Get-Job skickar ProcessJob-objekt nedåt i pipelinen. Cmdleten Format-Tablevisar egenskaperna Namn, ID och PSBeginTime för en schemalagd jobbinstans i en tabell.

Get-Job ProcessJob | Format-Table -Property Name, ID, PSBeginTime -Auto
Name       Id PSBeginTime
----       -- ---------
ProcessJob 43 11/2/2011 3:00:02 AM
ProcessJob 44 11/3/2011 3:00:02 AM
ProcessJob 45 11/4/2011 3:00:02 AM
ProcessJob 46 11/5/2011 3:00:02 AM
ProcessJob 47 11/6/2011 3:00:02 AM
ProcessJob 48 11/7/2011 12:00:01 AM
ProcessJob 49 11/7/2011 3:00:02 AM
ProcessJob 50 11/8/2011 3:00:02 AM

Om du vill få resultatet av en instans av ett schemalagt jobb använder du cmdleten Receive-Job . Följande kommando hämtar resultatet av den senaste instansen av ProcessJob (ID = 50).

Receive-Job -ID 50

Grundläggande metod för att hitta jobbresultat på disk

Om du vill hantera schemalagda jobb använder du jobb-cmdletar, till exempel Get-Job och Receive-Job.

Om Get-Job inte hämtar jobbinstansen eller Receive-Job inte får jobbresultatet kan du söka i körningshistorikfilerna efter jobbet på disken. Körningshistoriken innehåller en post med alla utlösta jobbinstanser.

Kontrollera att det finns en tidsstämpel med namnet katalog i katalogen för ett schemalagt jobb i följande sökväg:

$HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output

Till exempel:

C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output

Cmdleten Get-ChildItem hämtar till exempel körningshistoriken på disk för det schemalagda jobbet ProcessJob .

$Path = '$HOME\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output'
Get-ChildItem $Path
Directory: C:\Users\User01\AppData\Local\Microsoft\Windows\PowerShell
               \ScheduledJobs\ProcessJob\Output

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         11/2/2011   3:00 AM            20111102-030002-260
d----         11/3/2011   3:00 AM            20111103-030002-277
d----         11/4/2011   3:00 AM            20111104-030002-209
d----         11/5/2011   3:00 AM            20111105-030002-251
d----         11/6/2011   3:00 AM            20111106-030002-174
d----         11/7/2011  12:00 AM            20111107-000001-914
d----         11/7/2011   3:00 AM            20111107-030002-376

Varje tidsstämpel-namngiven katalog representerar en jobbinstans. Resultatet av varje jobbinstans sparas i en Results.xml fil i katalogen med tidsstämpelnamn.

Följande kommando hämtar till exempel Results.xml filer för varje sparad instans av det schemalagda jobbet ProcessJob. Om Results.xml filen saknas kan PowerShell inte returnera eller visa jobbresultatet.

$Path = '$HOME\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output\*\Results.xml'
Get-ChildItem $Path
Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell
               \ScheduledJobs\ProcessJob\Output

Jobb-cmdleten kanske inte kan hämta schemalagda jobbinstanser eller deras resultat eftersom MODULen PSScheduledJob inte importeras till sessionen.

Kommentar

Innan du använder en jobb-cmdlet på schemalagda jobbinstanser kontrollerar du att modulen PSScheduledJob ingår i sessionen. Utan modulen PSScheduledJob kan inte jobb-cmdletarna hämta schemalagda jobbinstanser eller deras resultat.

Så här importerar du MODULen PSScheduledJob :

Import-Module PSScheduledJob

Cmdleten Receive-Job kanske redan har returnerat resultatet

Om Receive-Job inte returnerar jobbinstansresultat kan det bero på att ett Receive-Job kommando har körts för den jobbinstansen i den aktuella sessionen utan parametern Behåll .

När du använder Receive-Job utan parametern Receive-JobBehåll returnerar jobbresultatet och anger jobbinstansens HasMoreData-egenskap till False. Värdet False innebär att Receive-Job jobbets resultat returnerades och att instansen inte har några fler resultat att returnera. Den här inställningen är lämplig för standardbakgrundsjobb, men inte för instanser av schemalagda jobb som sparas på disk.

Om du vill få jobbinstansresultatet igen startar du en ny PowerShell-session genom att PowerShellskriva . Importera modulen PSScheduledJob och försök Receive-Job igen.

Receive-Job -ID 50
#No results
PowerShell.exe
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.
Import-Module PSScheduledJob
Receive-Job -ID 50
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  ProcessName
-------  ------    -----      ----- -----   ------     --  -----------
1213         33    12348      21676    88    25.71   1608  CcmExec
29            4     1168       2920    43     0.02    748  conhost
46            6     2208       4612    45     0.03   1640  conhost

Använda parametern Behåll för att få resultat mer än en gång i en session

Om du vill få resultatet av en jobbinstans mer än en gång i en session använder du parametern Behåll för cmdleten Receive-Job .

Import-Module PSScheduledJob
Receive-Job -ID 50 -Keep
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  ProcessName
-------  ------    -----      ----- -----   ------     --  -----------
1213         33    12348      21676    88    25.71   1608  CcmExec
29            4     1168       2920    43     0.02    748  conhost
46            6     2208       4612    45     0.03   1640  conhost
Receive-Job -ID 50 -Keep
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  ProcessName
-------  ------    -----      ----- -----   ------     --  -----------
1213         33    12348      21676    88    25.71   1608  CcmExec
29            4     1168       2920    43     0.02    748  conhost
46            6     2208       4612    45     0.03   1640  conhost

Det schemalagda jobbet kan vara skadat

Om ett schemalagt jobb blir skadat tar PowerShell bort det skadade schemalagda jobbet och dess resultat. Du kan inte återställa resultatet av ett skadat schemalagt jobb.

Om du vill ta reda på om det fortfarande finns ett schemalagt jobb använder du cmdleten Get-ScheduledJob .

Get-ScheduledJob

Antalet resultat kan ha överskridit ExecutionHistoryLength

Egenskapen ExecutionHistoryLength för ett schemalagt jobb avgör hur många jobbinstanser och deras resultat som sparas på disken. Standardvärdet är 32. När antalet instanser av ett schemalagt jobb överskrider det här värdet tar PowerShell bort den äldsta jobbinstansen för att göra plats för varje ny jobbinstans.

Använd följande kommandoformat för att hämta värdet för egenskapen ExecutionHistoryLength för ett schemalagt jobb:

(Get-ScheduledJob <JobName>).ExecutionHistoryLength

Följande kommando hämtar till exempel värdet för egenskapen ExecutionHistoryLength för det schemalagda jobbet ProcessJob .

(Get-ScheduledJob ProcessJob).ExecutionHistoryLength

Om du vill ange eller ändra värdet för egenskapen ExecutionHistoryLength använder du parametern MaxResultCount för Register-ScheduledJob cmdletarna och Set-ScheduledJob .

Följande kommando ökar värdet för egenskapen ExecutionHistoryLength till 50.

Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50

Jobbinstansresultatet kan ha tagits bort

Parametern ClearExecutionHistory i cmdleten Set-ScheduledJob tar bort körningshistoriken för ett jobb. Du kan använda den här funktionen för att frigöra diskutrymme eller ta bort resultat som inte behövs, eller som redan används, analyseras eller sparas på en annan plats.

Om du vill ta bort körningshistoriken för ett schemalagt jobb använder du parametern ClearExecutionHistory för det schemalagda jobbet.

Följande kommando tar bort körningshistoriken för det schemalagda jobbet ProcessJob .

Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory

Dessutom tar cmdleten Remove-Job bort jobbresultat. När du använder Remove-Job för att ta bort ett schemalagt jobb tas alla instanser av jobbet bort på disken, inklusive körningshistoriken och alla jobbresultat.

Jobb som startas med cmdleten Start-Job sparas inte på disk

När du använder Start-Job för att starta ett schemalagt jobb startar ett standardbakgrundsjobb i stället för att använda en jobbutlösare Start-Job . Bakgrundsjobbet och dess resultat lagras inte i körningshistoriken för jobbet på disken.

Du kan använda cmdleten Get-Job för att hämta jobbet och cmdleten Receive-Job för att hämta jobbresultatet, men resultaten är endast tillgängliga tills du får dem, såvida du inte använder parametern Behåll för cmdleten Receive-Job .

Dessutom är bakgrundsjobb och deras resultat sessionsspecifika. de finns bara i den session där de skapas. Om du tar bort jobbet med Remove-Job, stänger sessionen eller stänger PowerShell tas jobbinstansen och dess resultat bort.

Schemalagt jobb körs inte

Schemalagda jobb körs inte automatiskt om jobbet utlöses eller det schemalagda jobbet är inaktiverat.

Använd cmdleten Get-ScheduledJob för att hämta det schemalagda jobbet. Kontrollera att värdet för egenskapen Enabled för det schemalagda jobbet är Sant.

Get-ScheduledJob ProcessJob
Id         Name            Triggers        Command         Enabled
--         ----            --------        -------         -------
4          ProcessJob      {1, 2}          Get-Process     True
(Get-ScheduledJob ProcessJob).Enabled
True

Använd cmdleten Get-JobTrigger för att hämta jobbutlösare för det schemalagda jobbet. Kontrollera att värdet för egenskapen Enabled för jobbutlösaren är Sant.

Get-ScheduledJob ProcessJob | Get-JobTrigger
Id      Frequency    Time                   DaysOfWeek            Enabled
--      ---------    ----                   ----------            -------
1       Weekly       11/7/2011 5:00:00 AM   {Monday, Thursday}    True
2       Daily        11/7/2011 3:00:00 PM                         True
Get-ScheduledJob ProcessJob|Get-JobTrigger|Format-Table ID, Enabled -Auto
Id Enabled
-- -------
1    True
2    True

Schemalagda jobb körs inte automatiskt om jobbutlösare är ogiltiga

En jobbutlösare kan till exempel ange ett datum tidigare eller ett datum som inte inträffar, till exempel den 5:e måndagen i månaden.

Schemalagda jobb körs inte automatiskt om villkoren för jobbutlösaren eller jobbalternativen inte är uppfyllda.

Ett schemalagt jobb som till exempel bara körs när en viss användare loggar in på datorn körs inte om användaren inte loggar in eller bara ansluter via fjärranslutning.

Granska alternativen för det schemalagda jobbet och kontrollera att de är uppfyllda. Ett schemalagt jobb som till exempel kräver att datorn är inaktiv eller kräver en nätverksanslutning eller har en lång IdleDuration eller en kort IdleTimeout kanske aldrig körs.

Använd cmdleten Get-ScheduledJobOption för att undersöka jobbalternativen och deras värden.

Get-ScheduledJobOption -Name ProcessJob
StartIfOnBatteries     : False
StopIfGoingOnBatteries : True
WakeToRun              : True
StartIfNotIdle         : True
StopIfGoingOffIdle     : False
RestartOnIdleResume    : False
IdleDuration           : 00:10:00
IdleTimeout            : 01:00:00
ShowInTaskScheduler    : True
RunElevated            : False
RunWithoutNetwork      : True
DoNotAllowDemandStart  : False
MultipleInstancePolicy : IgnoreNew
JobDefinition          : Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition

Beskrivningar av de schemalagda jobbalternativen finns i New-ScheduledJobOption.

Den schemalagda jobbinstansen kan ha misslyckats

Om ett schemalagt jobbkommando misslyckas rapporterar PowerShell det omedelbart genom att generera ett felmeddelande. Men om jobbet misslyckas när Schemaläggaren försöker köra det är felet inte tillgängligt för PowerShell.

Använd följande metoder för att identifiera och korrigera jobbfel:

Kontrollera händelseloggen för Schemaläggaren om det finns fel. Om du vill kontrollera loggen använder du Loggboken eller ett PowerShell-kommando, till exempel följande:

Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational |
 Where {$_.Message -like "fail"}

Kontrollera jobbposten i Schemaläggaren. Schemalagda PowerShell-jobb lagras i följande schemalagda aktivitetsmapp:

Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs

Det schemalagda jobbet kanske inte körs på grund av otillräcklig behörighet

Schemalagda jobb körs med behörigheterna för den användare som skapade jobbet eller behörigheterna för den användare som anges av parametern Credential i Register-ScheduledJob kommandot eller Set-ScheduledJob .

Om användaren inte har behörighet att köra kommandona eller skripten misslyckas jobbet.

Det går inte att hämta ett schemalagt jobb eller ett schemalagt jobb är skadat

I sällsynta fall kan schemalagda jobb skadas eller innehålla interna motsägelser som inte kan lösas. Detta inträffar vanligtvis när XML-filerna för det schemalagda jobbet redigeras manuellt, vilket resulterar i ogiltig XML.

När ett schemalagt jobb är skadat försöker PowerShell ta bort det schemalagda jobbet, dess körningshistorik och dess resultat från disken.

Om det inte går att ta bort det schemalagda jobbet får du ett skadat jobbfel varje gång du kör cmdleten Get-ScheduledJob .

Om du vill ta bort ett skadat schemalagt jobb använder du någon av följande metoder:

<ScheduledJobName> Ta bort katalogen för det schemalagda jobbet. Ta inte bort katalogen ScheduledJob .

Katalogens plats:

$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>

Till exempel:

C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>.

Använd Schemaläggaren för att ta bort det schemalagda jobbet. Schemalagda PowerShell-aktiviteter visas i följande sökväg för Schemaläggaren:

Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>

Jobb-cmdletar kan inte konsekvent hitta schemalagda jobb

När modulen PSScheduledJob inte finns i den aktuella sessionen kan jobb-cmdletarna inte hämta schemalagda jobb, starta dem eller få sina resultat.

Om du vill importera MODULen PSScheduledJob skriver Import-Module PSScheduledJob eller kör du eller hämtar en cmdlet i modulen, till exempel cmdleten Get-ScheduledJob . Från och med PowerShell 3.0 importeras moduler automatiskt när du får eller använder någon cmdlet i modulen.

När modulen PSScheduledJob inte finns i den aktuella sessionen är följande kommandosekvens möjlig.

Get-Job ProcessJob
Get-Job : The command cannot find the job because the job name
ProcessJob was not found.
Verify the value of the Name parameter, and then try the command again.
+ CategoryInfo          : ObjectNotFound: (ProcessJob:String) [Get-Job],
PSArgumentException
+ FullyQualifiedErrorId : JobWithSpecifiedNameNotFound,Microsoft.PowerShell.
Commands.GetJobCommand
Get-Job
Get-ScheduledJob ProcessJob
Id         Name            Triggers        Command      Enabled
--         ----            --------        -------      -------
4          ProcessJob      {1}             Get-Process  True
Get-Job ProcessJob
Id     Name         PSJobTypeName   State       HasMoreData     Location
--     ----         -------------   -----       -----------     --------
43     ProcessJob   PSScheduledJob  Completed   True            localhost
44     ProcessJob   PSScheduledJob  Completed   True            localhost
45     ProcessJob   PSScheduledJob  Completed   True            localhost
46     ProcessJob   PSScheduledJob  Completed   True            localhost
47     ProcessJob   PSScheduledJob  Completed   True            localhost
48     ProcessJob   PSScheduledJob  Completed   True            localhost
49     ProcessJob   PSScheduledJob  Completed   True            localhost
50     ProcessJob   PSScheduledJob  Completed   True            localhost

Det här beteendet beror på att Get-ScheduledJob kommandot automatiskt importerar MODULen PSScheduledJob och sedan kör kommandot.

Se även