Om felsökning av schemalagda jobb
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 läser du about_Scheduled_Jobs och relaterade schemalagda jobb om ämnen.
Det går inte att hitta jobbresultat
Grundläggande metod för att hämta jobbresultat i PowerShell
När ett schemalagt jobb körs skapas en instans av det schemalagda jobbet. Om du vill visa, hantera och hämta resultatet av schemalagda jobbinstanser använder du jobb-cmdletarna.
Anteckning
Om du vill använda jobb-cmdletar på instanser av schemalagda jobb måste modulen PSScheduledJob importeras till sessionen. Om du vill importera PSScheduledJob-modulen 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-Table
visar 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 hämta 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 processjobbet (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 för alla utlösta jobbinstanser.
Kontrollera att det finns en katalog med namnet tidsstämpel i katalogen för ett schemalagt jobb i följande sökväg:
$home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob <ScheduledJobName>\Output
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 katalog med namnet timestamp 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 denResults.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 har importerats till sessionen.
Anteckning
Innan du använder en jobb-cmdlet på schemalagda jobbinstanser kontrollerar du att modulen PSScheduledJob ingår i sessionen. Utan PSScheduledJob-modulen kan inte jobb-cmdletarna hämta schemalagda jobbinstanser eller deras resultat.
Så här importerar du PSScheduledJob-modulen :
Import-Module PSScheduledJob
Receive-Job-cmdleten 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-Job
Behå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 hämta jobbinstansresultatet igen startar du en ny PowerShell-session genom att PowerShell
skriva . Importera modulen PSScheduledJob och försök igen Receive-Job
.
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 skadas 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 för 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örningshistorik och alla jobbresultat.
Jobb som startas med hjälp av 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 bara 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 True.
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 True.
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 uppfylls.
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. Till exempel kan ett schemalagt jobb som kräver att datorn är inaktiv eller kräver en nätverksanslutning eller har en lång IdleDuration eller en kort IdleTimeout aldrig köras.
Använd cmdleten Get-ScheduledJobOption
för att undersöka jobbalternativen och deras värden.
Get-ScheduledJob -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 alternativen för schemalagt jobb 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:
Leta efter fel i händelseloggen för Schemaläggaren. 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 att det schemalagda jobbet ä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 felmeddelande om skadat jobb 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>
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 PSScheduledJob-modulen 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 en 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.