about_Scheduled_Jobs_Troubleshooting

Krótki opis

Objaśnienie sposobu rozwiązywania problemów z zaplanowanymi zadaniami

Długi opis

W tym dokumencie opisano niektóre problemy, które mogą wystąpić podczas korzystania z zaplanowanych funkcji zadań programu PowerShell i sugerują rozwiązania tych problemów.

Przed rozpoczęciem korzystania z zaplanowanych zadań programu PowerShell zobacz about_Scheduled_Jobs i powiązane zaplanowane zadania dotyczące tematów.

Aby uzyskać więcej informacji na temat poleceń cmdlet zawartych w module PSScheduledJob, zobacz PSScheduledJob.

Nie można odnaleźć wyników zadania

Podstawowa metoda pobierania wyników zadania w programie PowerShell

Po uruchomieniu zaplanowanego zadania program tworzy wystąpienie zaplanowanego zadania. Aby wyświetlić, zarządzać wystąpieniami zaplanowanych zadań i uzyskiwać je, użyj poleceń cmdlet zadania.

Uwaga

Aby użyć poleceń cmdlet zadania w wystąpieniach zaplanowanych zadań, moduł PSScheduledJob musi zostać zaimportowany do sesji. Aby zaimportować moduł PSScheduledJob , wpisz Import-Module PSScheduledJob lub użyj dowolnego zaplanowanego polecenia cmdlet zadania, takiego jak Get-ScheduledJob.

Aby uzyskać listę wszystkich wystąpień zaplanowanego zadania, użyj Get-Job polecenia cmdlet .

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

Polecenie Get-Job cmdlet wysyła obiekty ProcessJob w dół potoku. Polecenie Format-Table cmdlet wyświetla właściwości Name, ID i PSBeginTime zaplanowanego wystąpienia zadania w tabeli.

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

Aby uzyskać wyniki wystąpienia zaplanowanego zadania, użyj Receive-Job polecenia cmdlet . Następujące polecenie pobiera wyniki najnowszego wystąpienia zadania ProcessJob (identyfikator = 50).

Receive-Job -ID 50

Podstawowa metoda znajdowania wyników zadań na dysku

Aby zarządzać zaplanowanymi zadaniami, użyj poleceń cmdlet zadań, takich jak Get-Job i Receive-Job.

Jeśli Get-Job wystąpienie zadania nie zostanie wyświetlone lub Receive-Job nie otrzyma wyników zadania, możesz wyszukać pliki historii wykonywania dla zadania na dysku. Historia wykonywania zawiera rekord wszystkich wyzwolonych wystąpień zadań.

Sprawdź, czy w katalogu znajduje się katalog o nazwie sygnatury czasowej dla zaplanowanego zadania w następującej ścieżce:

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

Na przykład:

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

Na przykład polecenie Get-ChildItem cmdlet pobiera historię wykonywania na dysku zaplanowanego zadania 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

Za każdym razem katalog o nazwie timestamp reprezentuje wystąpienie zadania. Wyniki każdego wystąpienia zadania są zapisywane w pliku Results.xml w katalogu nazwanym sygnaturą czasową.

Na przykład następujące polecenie pobiera pliki Results.xml dla każdego zapisanego wystąpienia zaplanowanego zadania ProcessJob . Jeśli brakuje pliku Results.xml, program PowerShell nie może zwrócić ani wyświetlić wyników zadania.

$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

Polecenie cmdlet zadania może nie być w stanie pobrać zaplanowanych wystąpień zadań lub ich wyników, ponieważ moduł PSScheduledJob nie jest importowany do sesji.

Uwaga

Przed użyciem polecenia cmdlet zadania w zaplanowanych wystąpieniach zadań sprawdź, czy moduł PSScheduledJob jest uwzględniony w sesji. Bez modułu PSScheduledJob polecenia cmdlet zadania nie mogą uzyskać zaplanowanych wystąpień zadań ani ich wyników.

Aby zaimportować moduł PSScheduledJob :

Import-Module PSScheduledJob

Polecenie cmdlet Receive-Job mogło już zwrócić wyniki

Jeśli Receive-Job wystąpienie zadania nie zwraca wyników, może to być spowodowane uruchomieniem Receive-Job polecenia dla tego wystąpienia zadania w bieżącej sesji bez parametru Keep .

W przypadku użycia Receive-Job bez parametru Receive-JobKeep zwraca wyniki zadania i ustawia właściwość HasMoreData wystąpienia zadania na wartość False. Wartość False oznacza, że Receive-Job zwrócił wyniki zadania, a wystąpienie nie ma więcej wyników do zwrócenia. To ustawienie jest odpowiednie dla standardowych zadań w tle, ale nie dla wystąpień zaplanowanych zadań, które są zapisywane na dysku.

Aby ponownie uzyskać wyniki wystąpienia zadania, uruchom nową sesję programu PowerShell, wpisując polecenie PowerShell. Zaimportuj moduł PSScheduledJob i spróbuj ponownie wykonać Receive-Job polecenie.

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

Używanie parametru Keep w celu uzyskania wyników więcej niż jeden raz w sesji

Aby uzyskać wynik wystąpienia zadania więcej niż jeden raz w sesji, użyj parametru Receive-Job Keep polecenia cmdlet.

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

Zaplanowane zadanie może być uszkodzone

Jeśli zaplanowane zadanie zostanie uszkodzone, program PowerShell usunie uszkodzone zaplanowane zadanie i jego wyniki. Nie można odzyskać wyników uszkodzonego zaplanowanego zadania.

Aby określić, czy zaplanowane zadanie nadal istnieje, użyj Get-ScheduledJob polecenia cmdlet .

Get-ScheduledJob

Liczba wyników mogła przekroczyć wartość ExecutionHistoryLength

Właściwość ExecutionHistoryLength zaplanowanego zadania określa, ile wystąpień zadania i ich wyniki są zapisywane na dysku. Wartość domyślna to 32. Gdy liczba wystąpień zaplanowanego zadania przekracza tę wartość, program PowerShell usuwa najstarsze wystąpienie zadania, aby zapewnić miejsce dla każdego nowego wystąpienia zadania.

Aby uzyskać wartość właściwości ExecutionHistoryLength zaplanowanego zadania, użyj następującego formatu polecenia:

(Get-ScheduledJob <JobName>).ExecutionHistoryLength

Na przykład następujące polecenie pobiera wartość właściwości ExecutionHistoryLength zaplanowanego zadania ProcessJob .

(Get-ScheduledJob ProcessJob).ExecutionHistoryLength

Aby ustawić lub zmienić wartość właściwości ExecutionHistoryLength , użyj parametru MaxResultCount poleceń Register-ScheduledJob cmdlet i Set-ScheduledJob .

Następujące polecenie zwiększa wartość właściwości ExecutionHistoryLength do 50.

Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50

Wyniki wystąpienia zadania mogły zostać usunięte

Parametr Set-ScheduledJob ClearExecutionHistory polecenia cmdlet usuwa historię wykonywania zadania. Za pomocą tej funkcji można zwolnić miejsce na dysku lub usunąć wyniki, które nie są potrzebne, lub zostały już użyte, przeanalizowane lub zapisane w innej lokalizacji.

Aby usunąć historię wykonywania zaplanowanego zadania, użyj parametru ClearExecutionHistory zaplanowanego zadania.

Następujące polecenie usuwa historię wykonywania zaplanowanego zadania ProcesuJob .

Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory

Remove-Job Ponadto polecenie cmdlet usuwa wyniki zadania. Usunięcie zaplanowanego zadania powoduje Remove-Job usunięcie wszystkich wystąpień zadania na dysku, w tym historii wykonywania i wszystkich wyników zadania.

Zadania uruchomione przy użyciu polecenia cmdlet Start-Job nie są zapisywane na dysku

Gdy używasz Start-Job polecenia do uruchamiania zaplanowanego zadania, zamiast używać wyzwalacza zadania, Start-Job uruchamia standardowe zadanie w tle. Zadanie w tle i jego wyniki nie są przechowywane w historii wykonywania zadania na dysku.

Możesz użyć Get-Job polecenia cmdlet , aby pobrać zadanie i Receive-Job polecenie cmdlet, aby uzyskać wyniki zadania, ale wyniki są dostępne tylko do momentu ich otrzymania, chyba że użyjesz parametru Receive-Job Keep polecenia cmdlet.

Ponadto zadania w tle i ich wyniki są specyficzne dla sesji; istnieją tylko w sesji, w której są tworzone. Jeśli usuniesz zadanie za pomocą Remove-Jobpolecenia , zamknij sesję lub zamknij program PowerShell, wystąpienie zadania i jego wyniki zostaną usunięte.

Zaplanowane zadanie nie jest uruchamiane

Zaplanowane zadania nie są uruchamiane automatycznie, jeśli zadanie jest wyłączone lub zaplanowane zadanie.

Użyj polecenia cmdlet , Get-ScheduledJob aby pobrać zaplanowane zadanie. Sprawdź, czy wartość właściwości Włączone zaplanowanego zadania to True.

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

Get-JobTrigger Użyj polecenia cmdlet , aby pobrać wyzwalacze zadania zaplanowanego. Sprawdź, czy wartość właściwości Enabled wyzwalacza zadania to 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

Zaplanowane zadania nie są uruchamiane automatycznie, jeśli wyzwalacze zadania są nieprawidłowe

Na przykład wyzwalacz zadania może określić datę w przeszłości lub datę, która nie występuje, na przykład 5. poniedziałek miesiąca.

Zaplanowane zadania nie są uruchamiane automatycznie, jeśli warunki wyzwalacza zadania lub opcje zadania nie są spełnione.

Na przykład zaplanowane zadanie uruchamiane tylko wtedy, gdy określony użytkownik zaloguje się na komputerze, nie zostanie uruchomione, jeśli ten użytkownik nie zaloguje się lub połączy się tylko zdalnie.

Sprawdź opcje zaplanowanego zadania i upewnij się, że są one spełnione. Na przykład zaplanowane zadanie, które wymaga, aby komputer był w stanie bezczynności lub wymaga połączenia sieciowego albo ma długą wartość IdleDuration lub krótką wartość IdleTimeout , może nigdy nie działać.

Get-ScheduledJobOption Użyj polecenia cmdlet, aby sprawdzić opcje zadania i ich wartości.

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

Opisy zaplanowanych opcji zadań można znaleźć w temacie New-ScheduledJobOption.

Wystąpienie zaplanowanego zadania mogło zakończyć się niepowodzeniem

Jeśli zaplanowane polecenie zadania zakończy się niepowodzeniem, program PowerShell natychmiast zgłosi go, generując komunikat o błędzie. Jeśli jednak zadanie zakończy się niepowodzeniem, gdy harmonogram zadań spróbuje go uruchomić, błąd nie jest dostępny dla programu PowerShell.

Użyj następujących metod, aby wykryć i poprawić błędy zadań:

Sprawdź dziennik zdarzeń harmonogramu zadań pod kątem błędów. Aby sprawdzić dziennik, użyj polecenia Podgląd zdarzeń lub programu PowerShell, takiego jak:

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

Sprawdź rekord zadania w harmonogramie zadań. Zaplanowane zadania programu PowerShell są przechowywane w następującym folderze Zaplanowano zadanie:

Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs

Zaplanowane zadanie może nie zostać uruchomione z powodu niewystarczających uprawnień

Zaplanowane zadania są uruchamiane z uprawnieniami użytkownika, który utworzył zadanie lub uprawnienia użytkownika, który jest określony przez parametr Credential w poleceniu Register-ScheduledJob lub Set-ScheduledJob .

Jeśli ten użytkownik nie ma uprawnień do uruchamiania poleceń lub skryptów, zadanie kończy się niepowodzeniem.

Nie można pobrać zaplanowanego zadania lub zaplanowanego zadania jest uszkodzony

W rzadkich przypadkach zaplanowane zadania mogą stać się uszkodzone lub zawierać wewnętrzne sprzeczności, których nie można rozwiązać. Zazwyczaj dzieje się tak, gdy pliki XML zaplanowanego zadania są edytowane ręcznie, co powoduje nieprawidłowy kod XML.

Gdy zaplanowane zadanie jest uszkodzone, program PowerShell próbuje usunąć zaplanowane zadanie, jego historię wykonywania i wyniki z dysku.

Jeśli nie można usunąć zaplanowanego zadania, za każdym razem, gdy uruchomisz polecenie cmdlet, zostanie wyświetlony uszkodzony komunikat o błędzie Get-ScheduledJob zadania.

Aby usunąć uszkodzone zaplanowane zadanie, użyj jednej z następujących metod:

<ScheduledJobName> Usuń katalog zaplanowanego zadania. Nie usuwaj katalogu ScheduledJob .

Lokalizacja katalogu:

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

Na przykład:

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

Użyj harmonogramu zadań, aby usunąć zaplanowane zadanie. Zaplanowane zadania programu PowerShell są wyświetlane w następującej ścieżce harmonogramu zadań:

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

Polecenia cmdlet zadań nie mogą stale znajdować zaplanowanych zadań

Gdy moduł PSScheduledJob nie znajduje się w bieżącej sesji, polecenia cmdlet zadania nie mogą pobierać zaplanowanych zadań, uruchamiać ich ani pobierać wyników.

Aby zaimportować moduł PSScheduledJob , wpisz Import-Module PSScheduledJob lub uruchom lub pobierz dowolne polecenie cmdlet w module, takie jak Get-ScheduledJob polecenie cmdlet. Począwszy od programu PowerShell 3.0, moduły są importowane automatycznie po pobraniu lub użyciu dowolnego polecenia cmdlet w module.

Jeśli moduł PSScheduledJob nie znajduje się w bieżącej sesji, możliwa jest następująca sekwencja poleceń.

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

To zachowanie występuje, ponieważ Get-ScheduledJob polecenie automatycznie importuje moduł PSScheduledJob , a następnie uruchamia polecenie .

Zobacz też