共用方式為


關於排程工作疑難解答

簡短描述

說明如何解決排程工作的問題

完整描述

本文件說明使用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-JobProcessJob 物件傳送至管線。 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-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-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 屬性設定為 FalseFalse 值表示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-JobKeep 參數。

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-ScheduledJobMaxResultCount 參數。

下列命令會將 ExecutionHistoryLength 屬性的值增加到 50。

Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50

作業實例結果可能已刪除

Cmdlet 的 Set-ScheduledJobClearExecutionHistory 參數會刪除作業的執行歷程記錄。 您可以使用這項功能來釋出磁碟空間或刪除不需要或已使用、分析或儲存在不同的位置的結果。

若要刪除排程工作的執行歷程記錄,請使用排程作業的 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-ScheduledJobCredential 參數所指定之用戶的許可權。

如果使用者沒有執行命令或文本的許可權,作業就會失敗。

無法取得排程工作或排程工作已損毀

在少數情況下,排程的作業可能會損毀,或包含無法解決的內部問題。 一般而言,這會在手動編輯排程工作的 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 模組,然後執行 命令。

另請參閱

about_Scheduled_Jobs_Basics

about_Scheduled_Jobs_Advanced

about_Scheduled_Jobs

工作排程器