about_Scheduled_Jobs_Troubleshooting
Krátký popis
Vysvětluje, jak vyřešit problémy s naplánovanými úlohami.
Dlouhý popis
Tento dokument popisuje některé problémy, ke kterým může dojít při používání funkcí naplánované úlohy PowerShellu, a navrhuje řešení těchto problémů.
Před použitím naplánovaných úloh PowerShellu si přečtěte about_Scheduled_Jobs a související naplánované úlohy týkající se témat.
Další informace o rutinách obsažených v modulu PSScheduledJob najdete v tématu PSScheduledJob.
Výsledky úlohy se nedají najít
Základní metoda pro získání výsledků úloh v PowerShellu
Když se naplánovaná úloha spustí, vytvoří instanci naplánované úlohy. K zobrazení, správě a získání výsledků plánovaných instancí úloh použijte rutiny Úlohy.
Poznámka:
Pokud chcete použít rutiny Úlohy u instancí plánovaných úloh, musí se modul PSScheduledJob importovat do relace. Pokud chcete importovat modul PSScheduledJob , zadejte Import-Module PSScheduledJob
nebo použijte jakoukoli rutinu naplánované úlohy, například Get-ScheduledJob
.
Pokud chcete získat seznam všech instancí naplánované úlohy, použijte rutinu 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
Rutina Get-Job
odešle objekty ProcessJob do kanálu. Rutina Format-Table
zobrazí vlastnosti Name, ID a PSBeginTime naplánované instance úlohy v tabulce.
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
Pokud chcete získat výsledky instance naplánované úlohy, použijte rutinu Receive-Job
. Následující příkaz získá výsledky nejnovější instance ProcessJob (ID = 50).
Receive-Job -ID 50
Základní metoda hledání výsledků úlohy na disku
Ke správě naplánovaných úloh použijte rutiny úloh, například Get-Job
a Receive-Job
.
Pokud Get-Job
instanci úlohy nezískute nebo Receive-Job
se nezobrazí výsledky úlohy, můžete prohledat soubory historie spouštění úlohy na disku.
Historie spuštění obsahuje záznam všech aktivovaných instancí úloh.
Ověřte, že v adresáři existuje adresář s časovým razítkem pro naplánovanou úlohu v následující cestě:
$HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
Příklad:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
Například rutina Get-ChildItem
získá historii spuštění na disku naplánované úlohy 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
Každý adresář s časovým razítkem představuje instanci úlohy. Výsledky každé instance úlohy se uloží do souboru Results.xml v adresáři s časovým razítkem.
Například následující příkaz získá Results.xml soubory pro každou uloženou instanci naplánované úlohy ProcessJob . Pokud soubor Results.xml chybí, PowerShell nemůže vrátit nebo zobrazit výsledky úlohy.
$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
Rutina úlohy nemusí být schopná získat instance naplánovaných úloh nebo jejich výsledky, protože modul PSScheduledJob se do relace neimportuje.
Poznámka:
Před použitím rutiny úlohy u plánovaných instancí úloh ověřte, že modul PSScheduledJob je součástí relace. Bez modulu PSScheduledJob nemůžou rutiny úloh získat naplánované instance úloh ani jejich výsledky.
Import modulu PSScheduledJob :
Import-Module PSScheduledJob
Rutina Receive-Job už možná vrátila výsledky.
Pokud Receive-Job
nevrátí výsledky instance úlohy, může to být proto, že příkaz byl spuštěn pro danou Receive-Job
instanci úlohy v aktuální relaci bez parametru Keep .
Pokud použijete Receive-Job
bez parametru Keep , Receive-Job
vrátí výsledky úlohy a nastaví instanci úlohy HasMoreData vlastnost False. Hodnota False znamená, že Receive-Job
vrátil výsledky úlohy a instance nemá žádné další výsledky, které by se daly vrátit. Toto nastavení je vhodné pro standardní úlohy na pozadí, ale ne pro instance naplánovaných úloh, které se ukládají na disk.
Pokud chcete znovu získat výsledky instance úlohy, spusťte novou relaci PowerShellu zadáním PowerShell
. Importujte modul PSScheduledJob a zkuste Receive-Job
příkaz znovu.
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
Použití parametru Keep k získání výsledků více než jednou v relaci
Pokud chcete získat výsledek instance úlohy více než jednou v relaci, použijte parametr Keep rutiny 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
Naplánovaná úloha může být poškozená.
Pokud je naplánovaná úloha poškozená, PowerShell odstraní poškozenou naplánovanou úlohu a její výsledky. Výsledky poškozené naplánované úlohy nelze obnovit.
Pokud chcete zjistit, jestli naplánovaná úloha stále existuje, použijte tuto rutinu Get-ScheduledJob
.
Get-ScheduledJob
Počet výsledků může překročit ExecutionHistoryLength.
Vlastnost ExecutionHistoryLength naplánované úlohy určuje, kolik instancí úloh a jejich výsledků jsou uloženy na disk. Výchozí hodnota je 32. Když počet instancí naplánované úlohy překročí tuto hodnotu, PowerShell odstraní nejstarší instanci úlohy, aby se uvolnilo místo pro každou novou instanci úlohy.
Chcete-li získat hodnotu ExecutionHistoryLength vlastnost naplánované úlohy, použijte následující formát příkazu:
(Get-ScheduledJob <JobName>).ExecutionHistoryLength
Například následující příkaz získá hodnotu ExecutionHistoryLength vlastnost ProcessJob naplánované úlohy.
(Get-ScheduledJob ProcessJob).ExecutionHistoryLength
Chcete-li nastavit nebo změnit hodnotu ExecutionHistoryLength vlastnost, použijte MaxResultCount parametru Register-ScheduledJob
a Set-ScheduledJob
rutiny.
Následující příkaz zvýší hodnotu ExecutionHistoryLength vlastnost na 50.
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
Mohly se odstranit výsledky instance úlohy.
Parametr ClearExecutionHistory Set-ScheduledJob
rutiny odstraní historii spuštění úlohy. Pomocí této funkce můžete uvolnit místo na disku nebo odstranit výsledky, které nejsou potřeba nebo už použité, analyzované nebo uložené v jiném umístění.
Pokud chcete odstranit historii provádění naplánované úlohy, použijte parametr ClearExecutionHistory naplánované úlohy.
Následující příkaz odstraní historii provádění naplánované úlohy ProcessJob .
Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
Rutina Remove-Job
také odstraní výsledky úloh. Když použijete Remove-Job
k odstranění naplánované úlohy, odstraní se všechny instance úlohy na disku, včetně historie spuštění a všech výsledků úlohy.
Úlohy spuštěné pomocí rutiny Start-Job se neukládají na disk.
Když použijete Start-Job
ke spuštění naplánované úlohy místo triggeru úlohy, Start-Job
spustí se standardní úloha na pozadí. Úloha na pozadí a její výsledky se neukládají v historii provádění úlohy na disku.
Pomocí této Get-Job
rutiny můžete získat úlohu a rutinu Receive-Job
k získání výsledků úlohy, ale výsledky jsou k dispozici pouze do doby, než je obdržíte, pokud nepoužijete parametr Keep rutiny Receive-Job
.
Úlohy na pozadí a jejich výsledky jsou také specifické pro relaci; existují pouze v relaci, ve které jsou vytvořeny. Pokud odstraníte úlohu pomocí Remove-Job
příkazu , zavřete relaci nebo zavřete PowerShell, instance úlohy a její výsledky se odstraní.
Naplánovaná úloha se nespustí
Naplánované úlohy se nespouštějí automaticky, pokud se úloha aktivuje nebo je naplánovaná úloha zakázaná.
Pomocí rutiny Get-ScheduledJob
získáte naplánovanou úlohu. Ověřte, že hodnota vlastnosti Enabled naplánované úlohy je True.
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1, 2} Get-Process True
(Get-ScheduledJob ProcessJob).Enabled
True
Get-JobTrigger
Pomocí rutiny získáte aktivační události úlohy naplánované úlohy.
Ověřte, že hodnota vlastnosti Enabled aktivační události úlohy je 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
Naplánované úlohy se nespouštějí automaticky, pokud jsou triggery úloh neplatné
Trigger úlohy může například zadat datum v minulosti nebo datum, ke kterému nedojde, například 5. pondělí v měsíci.
Naplánované úlohy se nespouštějí automaticky, pokud nejsou splněné podmínky triggeru úlohy nebo možnosti úlohy.
Například naplánovaná úloha, která se spustí jenom v případě, že se konkrétní uživatel přihlásí k počítači, se nespustí, pokud se tento uživatel nepřihlásí nebo se připojí jenom vzdáleně.
Prozkoumejte možnosti naplánované úlohy a ujistěte se, že jsou splněné. Například naplánovaná úloha, která vyžaduje, aby byl počítač nečinný nebo vyžaduje síťové připojení, nebo má dlouhou dobu nečinnosti nebo krátký čas nečinnosti se nemusí spustit.
Pomocí rutiny Get-ScheduledJobOption
můžete prozkoumat možnosti úlohy a jejich hodnoty.
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
Popis možností naplánované úlohy najdete v tématu New-ScheduledJobOption.
Instance naplánované úlohy mohla selhát.
Pokud příkaz naplánované úlohy selže, PowerShell ho okamžitě hlásí generováním chybové zprávy. Pokud se však úloha nezdaří, když se plánovač úloh pokusí spustit, není tato chyba dostupná pro PowerShell.
K detekci a opravě selhání úloh použijte následující metody:
Zkontrolujte chyby v protokolu událostí Plánovače úloh. Pokud chcete zkontrolovat protokol, použijte Prohlížeč událostí nebo příkaz PowerShellu, například:
Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational |
Where {$_.Message -like "fail"}
Zkontrolujte záznam úlohy v Plánovači úloh. Naplánované úlohy PowerShellu jsou uložené v následující složce Naplánovaná úloha:
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
Naplánovaná úloha se nemusí spustit kvůli nedostatečným oprávněním.
Naplánované úlohy se spouštějí s oprávněními uživatele, který úlohu vytvořil, nebo oprávnění uživatele, který je zadaný parametrem Credential v Register-ScheduledJob
příkazu nebo Set-ScheduledJob
příkazu.
Pokud tento uživatel nemá oprávnění ke spuštění příkazů nebo skriptů, úloha selže.
Nelze získat naplánovanou úlohu nebo je naplánovaná úloha poškozená.
Ve výjimečných případech se můžou naplánované úlohy poškodit nebo obsahovat vnitřní rozpory, které nelze vyřešit. K tomu obvykle dochází, když jsou soubory XML pro naplánovanou úlohu ručně upraveny, což vede k neplatnému XML.
Když je naplánovaná úloha poškozená, PowerShell se pokusí odstranit naplánovanou úlohu, její historii spuštění a výsledky z disku.
Pokud naplánovanou úlohu nelze odebrat, zobrazí se při každém spuštění Get-ScheduledJob
rutiny chybová zpráva o poškozené úloze.
Chcete-li odebrat poškozenou naplánovanou úlohu, použijte některou z následujících metod:
<ScheduledJobName>
Odstraňte adresář pro naplánovanou úlohu. Neodstraňovat adresář ScheduledJob .
Umístění adresáře:
$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
Příklad:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>.
Pomocí plánovače úloh odstraňte naplánovanou úlohu. Naplánované úlohy PowerShellu se zobrazí v následující cestě plánovače úloh:
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
Rutiny úloh nemůžou konzistentně najít naplánované úlohy
Pokud modul PSScheduledJob není v aktuální relaci, rutiny úloh nemůžou získat naplánované úlohy, spustit je nebo získat výsledky.
Pokud chcete importovat modul PSScheduledJob , zadejte Import-Module PSScheduledJob
nebo spusťte nebo získejte jakoukoli rutinu v modulu, například rutinu Get-ScheduledJob
.
Počínaje PowerShellem 3.0 se moduly automaticky importují při získání nebo použití jakékoli rutiny v modulu.
Pokud modul PSScheduledJob není v aktuální relaci, je možné následující posloupnost příkazů.
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
K tomuto chování dochází, protože Get-ScheduledJob
příkaz automaticky importuje modul PSScheduledJob a pak spustí příkaz.