共用方式為


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資料表中排程工作實例的 NameIDPSBeginTime 屬性。

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-JobReceive-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-ChildItemCmdlet 會取得 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 屬性設定為 FalseReceive-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 模組,然後執行命令。

另請參閱