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-Jobodeš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 ClearExecutionHistorySet-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-Jobpří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.

Viz také