about_Scheduled_Jobs_Troubleshooting
簡単な説明
スケジュールされたジョブに関する問題を解決する方法について説明します
詳細な説明
このドキュメントでは、PowerShell のスケジュールされたジョブ機能を使用するときに発生する可能性がある問題の一部について説明し、これらの問題の解決策を提案します。
PowerShell のスケジュールされたジョブを使用する前に、トピックに関するabout_Scheduled_Jobsおよび関連するスケジュールされたジョブを参照してください。
PSScheduledJob モジュールに含まれるコマンドレットの詳細については、PSScheduledJob を参照してください。
ジョブの結果が見つかりません
PowerShell でジョブの結果を取得するための基本的な方法
スケジュールされたジョブを実行すると、スケジュールされたジョブのインスタンスが作成されます。 スケジュールされたジョブ インスタンスの結果を表示、管理、取得するには、ジョブ コマンドレットを使用します。
Note
スケジュールされたジョブのインスタンスで Job コマンドレットを使用するには、 PSScheduledJob モジュールをセッションにインポートする必要があります。 PSScheduledJob モジュールをインポートするには、Import-Module PSScheduledJob
スケジュールされたジョブ コマンドレット (例Get-ScheduledJob
: .
スケジュールされたジョブのすべてのインスタンスの一覧を取得するには、コマンドレットを Get-Job
使用します。
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
このコマンドレットはGet-Job
、ProcessJob オブジェクトをパイプラインの下に送信します。 このコマンドレットは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
使用します。 次のコマンドは、ProcessJob の最新のインスタンス (ID = 50) の結果を取得します。
Receive-Job -ID 50
ディスク上のジョブの結果を検索するための基本的な方法
スケジュールされたジョブを管理するには、次のような Get-Job
ジョブ コマンドレットを使用します Receive-Job
。
ジョブ インスタンスが取得されない場合、またはReceive-Job
ジョブの結果が得られない場合Get-Job
は、ディスク上のジョブの実行履歴ファイルを検索できます。
実行履歴には、トリガーされたすべてのジョブ インスタンスのレコードが含まれます。
スケジュールされたジョブのディレクトリに、次のパスにタイムスタンプ名のディレクトリがあることを確認します。
$HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
次に例を示します。
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
たとえば、このコマンドレットはGet-ChildItem
、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
PSScheduledJob モジュールがセッションにインポートされていないため、ジョブ コマンドレットはスケジュールされたジョブ インスタンスまたはその結果を取得できない可能性があります。
Note
スケジュールされたジョブ インスタンスでジョブ コマンドレットを使用する前に、PSScheduledJob モジュールがセッションに含まれていることを確認します。 PSScheduledJob モジュールがないと、ジョブ コマンドレットはスケジュールされたジョブ インスタンスまたはその結果を取得できません。
PSScheduledJob モジュールをインポートするには:
Import-Module PSScheduledJob
Receive-Job コマンドレットが既に結果を返している可能性がある
ジョブ インスタンスの結果が返されない場合Receive-Job
は、Keep パラメーターを指定せずに、現在のセッションでそのジョブ インスタンスに対してコマンドが実行されたことが原因Receive-Job
である可能性があります。
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 パラメーターを使用してセッションで複数回結果を取得する
セッションでジョブ インスタンスの結果を複数回取得するには、コマンドレットの Keep パラメーターをReceive-Job
使用します。
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
使用します。
Get-ScheduledJob
結果の数が ExecutionHistoryLength を超えている可能性があります
スケジュールされたジョブの ExecutionHistoryLength プロパティは、ディスクに保存されるジョブ インスタンスの数とその結果を決定します。 既定値は 32 です。 スケジュールされたジョブのインスタンス数がこの値を超えると、PowerShell は最も古いジョブ インスタンスを削除して、新しいジョブ インスタンスごとに余裕を持たれます。
スケジュールされたジョブの ExecutionHistoryLength プロパティの値を取得するには、次のコマンド形式を使用します。
(Get-ScheduledJob <JobName>).ExecutionHistoryLength
たとえば、次のコマンドは、ProcessJob スケジュールされたジョブの ExecutionHistoryLength プロパティの値を取得します。
(Get-ScheduledJob ProcessJob).ExecutionHistoryLength
ExecutionHistoryLength プロパティの値を設定または変更するには、およびSet-ScheduledJob
コマンドレットの MaxResultCount パラメーターをRegister-ScheduledJob
使用します。
次のコマンドは、ExecutionHistoryLength プロパティの値を 50 に増やします。
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
ジョブ インスタンスの結果が削除されている可能性があります
コマンドレットの ClearExecutionHistory パラメーター Set-ScheduledJob
は、ジョブの実行履歴を削除します。 この機能を使用すると、ディスク領域を解放したり、不要な結果や、既に使用、分析、または別の場所に保存されている結果を削除したりできます。
スケジュールされたジョブの実行履歴を削除するには、スケジュールされたジョブの ClearExecutionHistory パラメーターを使用します。
次のコマンドは、ProcessJob スケジュールされたジョブの実行履歴を削除します。
Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
また、コマンドレットはジョブの Remove-Job
結果を削除します。 スケジュールされたジョブを削除するために使用 Remove-Job
すると、実行履歴とすべてのジョブ結果を含め、ディスク上のジョブのすべてのインスタンスが削除されます。
Start-Job コマンドレットを使用して開始されたジョブがディスクに保存されない
ジョブ トリガーを使用 Start-Job
する代わりに、スケジュールされたジョブを開始するときに、 Start-Job
標準のバックグラウンド ジョブを開始します。 バックグラウンド ジョブとその結果は、ディスク上のジョブの実行履歴には格納されません。
コマンドレットを Get-Job
使用してジョブを取得し、コマンドレットを Receive-Job
使用してジョブの結果を取得できますが、コマンドレットの Receive-Job
Keep パラメーターを使用しない限り、結果は受け取るまでしか使用できません。
また、バックグラウンド ジョブとその結果はセッション固有です。これらは、作成されたセッションにのみ存在します。 ジョブ Remove-Job
を削除し、セッションを閉じるか、PowerShell を閉じると、ジョブ インスタンスとその結果が削除されます。
スケジュールされたジョブが実行されない
ジョブがトリガーされるか、スケジュールされたジョブが無効になっている場合、スケジュールされたジョブは自動的に実行されません。
コマンドレットを Get-ScheduledJob
使用して、スケジュールされたジョブを取得します。 スケジュールされたジョブの Enabled プロパティの値が True であることを確認します。
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1, 2} Get-Process True
(Get-ScheduledJob ProcessJob).Enabled
True
コマンドレットを Get-JobTrigger
使用して、スケジュールされたジョブのジョブ トリガーを取得します。
ジョブ トリガーの 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
使用して、ジョブ オプションとその値を調べます。
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
アクセス許可が不十分なため、スケジュールされたジョブが実行されない可能性があります
スケジュールされたジョブは、ジョブを作成したユーザーのアクセス許可、またはコマンドの Credential パラメーターで指定されたユーザーのアクセス許可を使用してSet-ScheduledJob
Register-ScheduledJob
実行されます。
そのユーザーにコマンドまたはスクリプトを実行する権限がない場合、ジョブは失敗します。
スケジュールされたジョブを取得できないか、スケジュールされたジョブが破損しています
まれに、スケジュールされたジョブが破損したり、解決できない内部矛盾が含まれている可能性があります。 通常、これは、スケジュールされたジョブの XML ファイルが手動で編集され、XML が無効になった場合に発生します。
スケジュールされたジョブが破損すると、PowerShell はスケジュールされたジョブ、その実行履歴、およびその結果をディスクから削除しようとします。
スケジュールされたジョブを削除できない場合は、コマンドレットを実行するたびに、破損したジョブ エラー メッセージが 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>
ジョブ コマンドレットでスケジュールされたジョブが一貫して見つからない
PSScheduledJob モジュールが現在のセッションにない場合、ジョブ コマンドレットはスケジュールされたジョブを取得したり、ジョブを開始したり、結果を取得したりできません。
PSScheduledJob モジュールをインポートするには、モジュール内のコマンドレット (コマンドレットなどGet-ScheduledJob
) を入力Import-Module PSScheduledJob
または実行または取得します。
PowerShell 3.0 以降では、モジュール内のコマンドレットを取得または使用すると、モジュールが自動的にインポートされます。
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 モジュールが自動的にインポートされ、コマンドが実行されるために発生します。
関連項目
PowerShell