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 PowerShell
eingeben. 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-Job
dem 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.