Freigeben über


about_Scheduled_Jobs_Troubleshooting

Kurze Beschreibung

Erläutert, wie Probleme mit geplanten Aufträgen behoben werden.

Lange Beschreibung

In diesem Dokument werden einige der Probleme beschrieben, die bei der Verwendung der geplanten Auftragsfeatures von PowerShell auftreten können, und es schlägt Lösungen für diese Probleme vor.

Bevor Sie geplante PowerShell-Aufträge verwenden, lesen Sie about_Scheduled_Jobs und die zugehörigen geplanten Aufträge zu Themen.

Weitere Informationen zu den Cmdlets, die im PSScheduledJob-Modul enthalten sind, finden Sie unter PSScheduledJob.

Auftragsergebnisse können nicht gefunden werden

Grundlegende Methode zum Abrufen von Auftragsergebnissen in PowerShell

Wenn ein geplanter Auftrag ausgeführt wird, wird eine Instanz des geplanten Auftrags erstellt. Verwenden Sie die Cmdlets "Auftrag", um die Ergebnisse von geplanten Auftragsinstanzen anzuzeigen, zu verwalten und abzurufen.

Hinweis

Um die Auftrags-Cmdlets für Instanzen geplanter Aufträge zu verwenden, muss das PSScheduledJob-Modul in die Sitzung importiert werden. Um das PSScheduledJob-Modul zu importieren, geben Oder Import-Module PSScheduledJob verwenden Sie ein beliebiges geplantes Auftrags-Cmdlet, z Get-ScheduledJob. B. .

Verwenden Sie das Get-Job Cmdlet, um eine Liste aller Instanzen eines geplanten Auftrags abzurufen.

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

Das Get-Job Cmdlet sendet ProcessJob-Objekte an die Pipeline. Das Format-Table Cmdlet zeigt die Eigenschaften Name, ID und PSBeginTime einer geplanten Auftragsinstanz in einer Tabelle an.

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

Verwenden Sie das Receive-Job Cmdlet, um die Ergebnisse einer Instanz eines geplanten Auftrags abzurufen. Der folgende Befehl ruft die Ergebnisse der neuesten Instanz des ProcessJob (ID = 50) ab.

Receive-Job -ID 50

Grundlegende Methode zum Auffinden von Auftragsergebnissen auf dem Datenträger

Um geplante Aufträge zu verwalten, verwenden Sie die Auftrags-Cmdlets, z Get-Job . B. und Receive-Job.

Wenn Get-Job die Auftragsinstanz nicht abgerufen wird oder Receive-Job die Auftragsergebnisse nicht abgerufen werden, können Sie die Ausführungsverlaufsdateien für den Auftrag auf dem Datenträger durchsuchen. Der Ausführungsverlauf enthält einen Datensatz aller ausgelösten Auftragsinstanzen.

Stellen Sie sicher, dass im Verzeichnis ein Zeitstempelverzeichnis für einen geplanten Auftrag im folgenden Pfad vorhanden ist:

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

Zum Beispiel:

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

Beispielsweise ruft das Get-ChildItem Cmdlet den Ausführungsverlauf des geplanten ProcessJob-Auftrags auf dem Datenträger ab.

$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

Jedes Zeitstempel-benanntes Verzeichnis stellt eine Auftragsinstanz dar. Die Ergebnisse jeder Auftragsinstanz werden in einer Results.xml Datei im Zeitstempel-benannten Verzeichnis gespeichert.

Beispielsweise ruft der folgende Befehl die Results.xml Dateien für jede gespeicherte Instanz des geplanten ProcessJob-Auftrags ab. Wenn die Results.xml Datei fehlt, kann PowerShell die Auftragsergebnisse nicht zurückgeben oder anzeigen.

$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

Das Auftrags-Cmdlet kann möglicherweise keine geplanten Auftragsinstanzen oder deren Ergebnisse abrufen, da das PSScheduledJob-Modul nicht in die Sitzung importiert wird.

Hinweis

Bevor Sie ein Auftrags-Cmdlet für geplante Auftragsinstanzen verwenden, überprüfen Sie, ob das PSScheduledJob-Modul in der Sitzung enthalten ist. Ohne das PSScheduledJob-Modul können die Auftrags-Cmdlets keine geplanten Auftragsinstanzen oder deren Ergebnisse abrufen.

So importieren Sie das PSScheduledJob-Modul :

Import-Module PSScheduledJob

Das Cmdlet "Receive-Job" hat möglicherweise bereits die Ergebnisse zurückgegeben.

Wenn Receive-Job keine Auftragsinstanzergebnisse zurückgegeben werden, liegt dies möglicherweise daran, dass ein Receive-Job Befehl für diese Auftragsinstanz in der aktuellen Sitzung ohne den Parameter Keep ausgeführt wurde.

Wenn Sie ohne den Parameter Keep verwendenReceive-Job, Receive-Job werden die Auftragsergebnisse zurückgegeben und die HasMoreData-Eigenschaft der Auftragsinstanz auf "False" festgelegt. Der Wert "False" bedeutet, dass Receive-Job die Ergebnisse des Auftrags zurückgegeben wurden und die Instanz keine ergebnisse mehr zurückgibt. Diese Einstellung ist für Standardhintergrundaufträge geeignet, aber nicht für Instanzen geplanter Aufträge, die auf dem Datenträger gespeichert werden.

Um die Ergebnisse der Auftragsinstanz erneut zu erhalten, starten Sie eine neue PowerShell-Sitzung, indem Sie folgendes PowerShelleingeben. Importieren Sie das PSScheduledJob-Modul , und versuchen Sie es Receive-Job erneut.

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

Verwenden des Parameters "Keep", um Ergebnisse mehr als einmal in einer Sitzung abzurufen

Verwenden Sie den Keep-Parameter des Receive-Job Cmdlets, um das Ergebnis einer Auftragsinstanz mehr als einmal in einer Sitzung abzurufen.

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

Der geplante Auftrag ist möglicherweise beschädigt.

Wenn ein geplanter Auftrag beschädigt wird, löscht PowerShell den beschädigten geplanten Auftrag und seine Ergebnisse. Sie können die Ergebnisse eines beschädigten geplanten Auftrags nicht wiederherstellen.

Um festzustellen, ob ein geplanter Auftrag noch vorhanden ist, verwenden Sie das Get-ScheduledJob Cmdlet.

Get-ScheduledJob

Die Anzahl der Ergebnisse hat die ExecutionHistoryLength möglicherweise überschritten.

Die ExecutionHistoryLength-Eigenschaft eines geplanten Auftrags bestimmt, wie viele Auftragsinstanzen und deren Ergebnisse auf dem Datenträger gespeichert werden. Der Standardwert ist 32. Wenn die Anzahl der Instanzen eines geplanten Auftrags diesen Wert überschreitet, löscht PowerShell die älteste Auftragsinstanz, um Platz für jede neue Auftragsinstanz zu schaffen.

Verwenden Sie das folgende Befehlsformat, um den Wert der ExecutionHistoryLength-Eigenschaft eines geplanten Auftrags abzurufen:

(Get-ScheduledJob <JobName>).ExecutionHistoryLength

Der folgende Befehl ruft beispielsweise den Wert der ExecutionHistoryLength-Eigenschaft des geplanten ProcessJob-Auftrags ab.

(Get-ScheduledJob ProcessJob).ExecutionHistoryLength

Um den Wert der ExecutionHistoryLength-Eigenschaft festzulegen oder zu ändern, verwenden Sie den MaxResultCount-Parameter der und Set-ScheduledJob cmdletsRegister-ScheduledJob.

Der folgende Befehl erhöht den Wert der ExecutionHistoryLength-Eigenschaft auf 50.

Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50

Die Auftragsinstanzergebnisse wurden möglicherweise gelöscht.

Der ClearExecutionHistory-Parameter des Set-ScheduledJob Cmdlets löscht den Ausführungsverlauf eines Auftrags. Sie können dieses Feature verwenden, um Speicherplatz freizugeben oder Ergebnisse zu löschen, die nicht benötigt oder bereits verwendet, analysiert oder an einem anderen Speicherort gespeichert wurden.

Um den Ausführungsverlauf eines geplanten Auftrags zu löschen, verwenden Sie den ClearExecutionHistory-Parameter des geplanten Auftrags.

Mit dem folgenden Befehl wird der Ausführungsverlauf des geplanten ProcessJob-Auftrags gelöscht.

Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory

Außerdem löscht das Remove-Job Cmdlet auftragsergebnisse. Wenn Sie Remove-Job einen geplanten Auftrag löschen, werden alle Instanzen des Auftrags auf dem Datenträger gelöscht, einschließlich des Ausführungsverlaufs und aller Auftragsergebnisse.

Aufträge, die mit dem Cmdlet "Startauftrag" gestartet werden, werden nicht auf dem Datenträger gespeichert.

Wenn Sie einen Start-Job geplanten Auftrag starten, anstatt einen Auftragstrigger zu verwenden, Start-Job wird ein Standardhintergrundauftrag gestartet. Der Hintergrundauftrag und die zugehörigen Ergebnisse werden nicht im Ausführungsverlauf des Auftrags auf dem Datenträger gespeichert.

Sie können das Get-Job Cmdlet verwenden, um den Auftrag und das Receive-Job Cmdlet abzurufen, um die Auftragsergebnisse abzurufen, aber die Ergebnisse sind nur verfügbar, bis Sie sie erhalten, es sei denn, Sie verwenden den Parameter Keep des Receive-Job Cmdlets.

Außerdem sind Hintergrundaufträge und ihre Ergebnisse sitzungsspezifisch; sie sind nur in der Sitzung vorhanden, in der sie erstellt werden. Wenn Sie den Auftrag mit Remove-Jobdem Auftrag löschen, die Sitzung schließen oder PowerShell schließen, werden die Auftragsinstanz und die zugehörigen Ergebnisse gelöscht.

Geplanter Auftrag wird nicht ausgeführt

Geplante Aufträge werden nicht automatisch ausgeführt, wenn der Auftrag auslöst oder der geplante Auftrag deaktiviert ist.

Verwenden Sie das Get-ScheduledJob Cmdlet, um den geplanten Auftrag abzurufen. Stellen Sie sicher, dass der Wert der Enabled-Eigenschaft des geplanten Auftrags "True" ist.

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

Verwenden Sie das Get-JobTrigger Cmdlet, um die Auftragstrigger des geplanten Auftrags abzurufen. Stellen Sie sicher, dass der Wert der Enabled-Eigenschaft des Auftragstriggers "True" ist.

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

Geplante Aufträge werden nicht automatisch ausgeführt, wenn Auftragstrigger ungültig sind

Beispielsweise kann ein Auftragstrigger ein Datum in der Vergangenheit oder ein Datum angeben, das nicht eintritt, z. B. den 5. Montag des Monats.

Geplante Aufträge werden nicht automatisch ausgeführt, wenn die Bedingungen des Auftragstriggers oder die Auftragsoptionen nicht erfüllt sind.

Beispielsweise wird ein geplanter Auftrag ausgeführt, der nur ausgeführt wird, wenn sich ein bestimmter Benutzer beim Computer anmeldet, nicht ausgeführt wird, wenn sich dieser Benutzer nicht anmeldet oder nur remote eine Verbindung herstellt.

Überprüfen Sie die Optionen des geplanten Auftrags, und stellen Sie sicher, dass sie zufrieden sind. Beispielsweise kann ein geplanter Auftrag, der erfordert, dass der Computer im Leerlauf ist oder eine Netzwerkverbindung erfordert, oder eine lange IdleDuration oder ein kurzes IdleTimeout nie ausgeführt werden.

Verwenden Sie das Get-ScheduledJobOption Cmdlet, um die Auftragsoptionen und deren Werte zu untersuchen.

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

Beschreibungen der geplanten Auftragsoptionen finden Sie unter New-ScheduledJobOption.

Fehler bei der geplanten Auftragsinstanz

Wenn ein geplanter Auftragsbefehl fehlschlägt, meldet PowerShell ihn sofort, indem eine Fehlermeldung generiert wird. Wenn der Auftrag jedoch fehlschlägt, wenn der Taskplaner versucht, ihn auszuführen, ist der Fehler für PowerShell nicht verfügbar.

Verwenden Sie die folgenden Methoden zum Erkennen und Beheben von Auftragsfehlern:

Überprüfen Sie das Ereignisprotokoll für den Taskplaner auf Fehler. Um das Protokoll zu überprüfen, verwenden Sie Ereignisanzeige oder einen PowerShell-Befehl wie die folgenden:

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

Überprüfen Sie den Auftragsdatensatz im Taskplaner. Geplante PowerShell-Aufträge werden im folgenden Ordner "Geplante Aufgabe" gespeichert:

Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs

Der geplante Auftrag kann aufgrund unzureichender Berechtigungen nicht ausgeführt werden.

Geplante Aufträge werden mit den Berechtigungen des Benutzers ausgeführt, der den Auftrag erstellt hat, oder die Berechtigungen des Benutzers, der vom Parameter "Credential " im Register-ScheduledJob oder Set-ScheduledJob Befehl angegeben ist.

Wenn dieser Benutzer nicht über die Berechtigung zum Ausführen der Befehle oder Skripts verfügt, schlägt der Auftrag fehl.

Der geplante Auftrag kann nicht abgerufen werden, oder der geplante Auftrag ist beschädigt.

In seltenen Fällen können geplante Aufträge beschädigt werden oder interne Widersprüche enthalten, die nicht aufgelöst werden können. Dies geschieht in der Regel, wenn die XML-Dateien für den geplanten Auftrag manuell bearbeitet werden, was zu ungültigen XML-Daten führt.

Wenn ein geplanter Auftrag beschädigt ist, versucht PowerShell, den geplanten Auftrag, seinen Ausführungsverlauf und seine Ergebnisse vom Datenträger zu löschen.

Wenn der geplante Auftrag nicht entfernt werden kann, wird bei jeder Ausführung des Get-ScheduledJob Cmdlets eine Fehlermeldung mit beschädigtem Auftrag angezeigt.

Um einen beschädigten geplanten Auftrag zu entfernen, verwenden Sie eine der folgenden Methoden:

Löschen Sie das <ScheduledJobName> Verzeichnis für den geplanten Auftrag. Löschen Sie nicht das ScheduledJob-Verzeichnis .

Speicherort des Verzeichnisses:

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

Zum Beispiel:

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

Verwenden Sie "Taskplaner", um den geplanten Auftrag zu löschen. Geplante PowerShell-Vorgänge werden im folgenden Pfad für den Aufgabenplaner angezeigt:

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

Auftrags-Cmdlets können geplante Aufträge nicht konsistent finden

Wenn sich das PSScheduledJob-Modul nicht in der aktuellen Sitzung befindet, können die Auftrags-Cmdlets keine geplanten Aufträge abrufen, sie starten oder ihre Ergebnisse abrufen.

Um das PSScheduledJob-Modul zu importieren, geben Import-Module PSScheduledJob Sie ein Cmdlet in das Modul ein, oder führen Sie es aus, oder rufen Sie es ab, z. B. das Get-ScheduledJob Cmdlet. Ab PowerShell 3.0 werden Module automatisch importiert, wenn Sie ein beliebiges Cmdlet im Modul abrufen oder verwenden.

Wenn sich das PSScheduledJob-Modul nicht in der aktuellen Sitzung befindet, ist die folgende Befehlssequenz möglich.

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

Dieses Verhalten tritt auf, da der Get-ScheduledJob Befehl automatisch das PSScheduledJob-Modul importiert und dann den Befehl ausführt.

Weitere Informationen