簡短描述
說明如何解決排程工作的問題
完整描述
本文件說明使用PowerShell排程的作業功能時可能會遇到的一些問題,並建議這些問題的解決方案。
在使用PowerShell排程工作之前,請參閱 about_Scheduled_Jobs 和主題的相關排程工作。
找不到作業結果
在 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
會顯示數據表中排程工作實例的名稱、 標識碼和 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 的最新實例結果 (標識碼 = 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
,會傳回作業結果,Receive-Job
並將作業實例的 HasMoreData 屬性設定為 False。 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-ScheduledJob -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 會嘗試刪除排程工作、其執行歷程記錄,以及磁碟的結果。
如果無法移除排程的工作,每次執行 Cmdlet 時,您都會收到損毀的 Get-ScheduledJob
作業錯誤訊息。
若要移除損毀的排程工作,請使用下列其中一種方法:
<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 模組,然後執行 命令。