about_Scheduled_Jobs_Troubleshooting
簡短描述
說明如何解決排程工作的問題
詳細描述
本文件說明使用PowerShell排程作業功能時可能會遇到的一些問題,並建議這些問題的解決方案。
使用 PowerShell 排程工作之前,請參閱 about_Scheduled_Jobs 和主題的相關排程工作。
如需 PSScheduledJob 模組中包含的 Cmdlet 詳細資訊,請參閱 PSScheduledJob。
找不到工作結果
在 PowerShell 中取得作業結果的基本方法
當排程工作執行時,它會建立排程作業的實例。 若要檢視、管理及取得排程工作實例的結果,請使用作業 Cmdlet。
注意
若要在排程工作的實例上使用作業 Cmdlet, 必須將 PSScheduledJob 模組匯入會話。 若要匯入 PSScheduledJob 模組,請輸入 Import-Module PSScheduledJob
或使用任何排程的工作 Cmdlet,例如 Get-ScheduledJob
。
若要取得排程作業的所有實例清單,請使用 Get-Job
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
Cmdlet 會將 Get-Job
ProcessJob 物件傳送至管線。 Cmdlet 會顯示Format-Table
資料表中排程工作實例的 Name、ID 和 PSBeginTime 屬性。
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
若要取得排程作業實例的結果,請使用 Receive-Job
Cmdlet。 下列命令會取得 ProcessJob 的最新實例結果(ID = 50)。
Receive-Job -ID 50
在磁碟上尋找作業結果的基本方法
若要管理排程的工作,請使用作業 Cmdlet,例如 Get-Job
和 Receive-Job
。
如果未 Get-Job
取得作業實例或 Receive-Job
未取得作業結果,您可以搜尋磁碟上作業的執行歷程記錄檔。
執行歷程記錄包含所有觸發作業實例的記錄。
確認下列路徑中排程作業的目錄中有時間戳命名的目錄:
$HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
例如:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
例如,Get-ChildItem
Cmdlet 會取得 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
每個時間戳命名目錄都代表作業實例。 每個作業實例的結果都會儲存在 時間戳命名目錄的Results.xml 檔案中。
例如,下列命令會取得 ProcessJob 排程作業之每個已儲存實例的Results.xml檔案。 如果Results.xml檔案遺失,PowerShell 就無法傳回或顯示作業結果。
$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
作業 Cmdlet 可能無法取得排程的工作實例或其結果,因為 PSScheduledJob 模組未匯入會話。
注意
在排程工作實例上使用作業 Cmdlet 之前,請先確認 會話中包含 PSScheduledJob 模組。 如果沒有 PSScheduledJob 模組,作業 Cmdlet 就無法取得排程的工作實例或其結果。
若要匯入 PSScheduledJob 模組:
Import-Module PSScheduledJob
Receive-Job Cmdlet 可能已經傳回結果
如果未 Receive-Job
傳回作業實例結果,可能是因為 Receive-Job
命令已在目前會話中針對該作業實例執行,而沒有 Keep 參數。
當您不使用 Keep 參數時Receive-Job
,會傳回作業結果,並將作業實例的 HasMoreData 屬性設定為 False。Receive-Job
False 值表示Receive-Job
傳回作業的結果,而 實例沒有傳回更多結果。 此設定適用於標準背景工作,但不適用於儲存至磁碟之排程作業的實例。
若要再次取得作業實例結果,請輸入 PowerShell
來啟動新的PowerShell工作階段。 匯入 PSScheduledJob 模組,然後再試一 Receive-Job
次命令。
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
使用 Keep 參數在工作階段中取得一次以上的結果
若要在會話中取得作業實例多次的結果,請使用 Cmdlet 的 Receive-Job
Keep 參數。
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
排程工作可能已損毀
如果排程工作損毀,PowerShell 會刪除損毀的排程工作及其結果。 您無法復原已損毀排程作業的結果。
若要判斷排程工作是否存在,請使用 Get-ScheduledJob
Cmdlet。
Get-ScheduledJob
結果數目可能已超過 ExecutionHistoryLength
排 程作業的 ExecutionHistoryLength 屬性會決定將多少個作業實例及其結果儲存至磁碟。 預設值為 32。 當排程作業的實例數目超過此值時,PowerShell 會刪除最舊的作業實例,讓每個新作業實例騰出空間。
若要取得排程作業之 ExecutionHistoryLength 屬性的值,請使用下列命令格式:
(Get-ScheduledJob <JobName>).ExecutionHistoryLength
例如,下列命令會取得 ProcessJob 排程作業的 ExecutionHistoryLength 屬性值。
(Get-ScheduledJob ProcessJob).ExecutionHistoryLength
若要設定或變更 ExecutionHistoryLength 屬性的值,請使用 和 Set-ScheduledJob
Cmdlet 的 Register-ScheduledJob
MaxResultCount 參數。
下列命令會將 ExecutionHistoryLength 屬性的值增加到 50。
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
作業實例結果可能已刪除
Cmdlet 的 Set-ScheduledJob
ClearExecutionHistory 參數會刪除作業的執行歷程記錄。 您可以使用此功能來釋出磁碟空間或刪除不需要或已使用、分析或儲存在不同的位置的結果。
若要刪除排程作業的執行歷程記錄,請使用 排程作業的 ClearExecutionHistory 參數。
下列命令會刪除 ProcessJob 排程作業的執行歷程記錄。
Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
此外, Remove-Job
Cmdlet 會刪除作業結果。 當您使用 Remove-Job
刪除排程工作時,它會刪除磁碟上作業的所有實例,包括執行歷程記錄和所有作業結果。
使用 Start-Job Cmdlet 啟動的作業不會儲存到磁碟
當您使用 Start-Job
來啟動排程工作,而不是使用作業觸發程式時, Start-Job
會啟動標準背景工作。 背景作業及其結果不會儲存在磁碟上作業的執行歷程記錄中。
您可以使用 Get-Job
Cmdlet 來取得作業和 Receive-Job
Cmdlet 來取得作業結果,但只有在您收到結果之前,才能使用結果,除非您使用 Cmdlet 的 Receive-Job
Keep 參數。
此外,背景工作及其結果是會話特定的;它們只存在於建立它們的會話中。 如果您使用 刪除作業 Remove-Job
,請關閉工作階段或關閉 PowerShell,則會刪除作業實例及其結果。
排程工作未執行
如果作業觸發程式或排程工作已停用,排程工作就不會自動執行。
Get-ScheduledJob
使用 Cmdlet 取得排程的工作。 確認 排程作業的 Enabled 屬性值為 True。
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1, 2} Get-Process True
(Get-ScheduledJob ProcessJob).Enabled
True
Get-JobTrigger
使用 Cmdlet 取得排程工作的工作觸發程式。
確認 作業觸發程式的 Enabled 屬性值為 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
如果作業觸發程式無效,排程工作不會自動執行
例如,作業觸發程式可能會指定過去日期或未發生的日期,例如當月第 5 個星期一。
如果不符合作業觸發程式的條件或作業選項,排程的工作不會自動執行。
例如,只有當特定使用者登入計算機時,才會執行的排程工作,如果該使用者未登入或僅從遠端連線,則不會執行。
檢查排程工作的選項,並確定其已滿足。 例如,需要計算機閑置或需要網路連線的排程工作,或具有長時間 的IdleDuration 或短暫 的IdleTimeout 可能永遠不會執行。
Get-ScheduledJobOption
使用 Cmdlet 來檢查作業選項及其值。
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
如需排程作業選項的描述,請參閱 New-ScheduledJobOption。
排程的工作實例可能失敗
如果排程的作業命令失敗,PowerShell 會藉由產生錯誤訊息立即報告它。 不過,如果工作排程器嘗試執行作業失敗,PowerShell 就無法使用錯誤。
使用下列方法來偵測和更正作業失敗:
檢查工作排程器事件記錄檔中是否有錯誤。 若要檢查記錄檔,請使用 事件檢視器 或 PowerShell 命令,如下所示:
Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational |
Where {$_.Message -like "fail"}
檢查工作排程器中的作業記錄。 PowerShell 排程工作會儲存在下列工作排程資料夾中:
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
排程工作可能無法執行,因為許可權不足
排程的工作會以建立作業的使用者許可權執行,或是或 Set-ScheduledJob
命令中 Register-ScheduledJob
Credential 參數所指定之用戶的許可權。
如果該用戶沒有執行命令或文本的許可權,作業就會失敗。
無法取得排程工作或排程工作已損毀
在罕見的情況下,排程的工作可能會損毀或包含無法解決的內部矛盾。 一般而言,當手動編輯排程工作的 XML 檔案時,就會發生這種情況,導致 XML 無效。
當排程工作損毀時,PowerShell 會嘗試刪除排程的作業、其執行歷程記錄,以及磁碟的結果。
如果無法移除排程工作,每次執行 Get-ScheduledJob
Cmdlet 時,您都會收到損毀的作業錯誤訊息。
若要移除損毀的排程工作,請使用下列其中一種方法:
<ScheduledJobName>
刪除排程作業的目錄。 請勿刪除 ScheduledJob 目錄。
目錄的位置:
$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
例如:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>.
使用工作排程器刪除排程工作。 PowerShell 排程工作會出現在下列工作排程器路徑中:
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
作業 Cmdlet 無法一致地找到排程的工作
當 PSScheduledJob 模組不在目前的工作階段中時,作業 Cmdlet 無法取得排程的工作、啟動作業或取得其結果。
若要匯入 PSScheduledJob 模組,請輸入 Import-Module PSScheduledJob
或執行或取得模組中的任何 Cmdlet,例如 Get-ScheduledJob
Cmdlet。
從 PowerShell 3.0 開始,當您取得或使用模組中的任何 Cmdlet 時,模組會自動匯入。
當 PSScheduledJob 模組不在目前的作業階段中時,可能會有下列命令順序。
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
發生此行為是因為 Get-ScheduledJob
命令會自動匯入 PSScheduledJob 模組,然後執行命令。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應