簡単な説明
スケジュールされたジョブに関する問題を解決する方法について説明します
詳細な説明
このドキュメントでは、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
などのジョブ コマンドレットを使用します。
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
コマンドレットは、スケジュールされたジョブ 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
がジョブ インスタンスの結果を返さない場合は、Receive-Job
パラメーターを指定せずに、現在のセッションでそのジョブ インスタンスに対して コマンドが実行されたことが原因である可能性があります。
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 パラメーターを使用してセッションで複数回結果を取得する
セッションでジョブ インスタンスの結果を複数回取得するには、 コマンドレットの 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 プロパティの値を設定または変更するには、およびRegister-ScheduledJob
コマンドレットの Set-ScheduledJob
パラメーターを使用します。
次のコマンドは、 ExecutionHistoryLength プロパティの値を 50 に増やします。
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
ジョブ インスタンスの結果が削除されている可能性があります
コマンドレットの 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 月曜日など) を指定できます。
ジョブ トリガーまたはジョブ オプションの条件が満たされていない場合、スケジュールされたジョブは自動的に実行されません。
たとえば、特定のユーザーがコンピューターにログオンした場合にのみ実行されるスケジュールされたジョブは、そのユーザーがログオンしない場合や、リモートでのみ接続する場合は実行されません。
スケジュールされたジョブのオプションを調べて、それらが満たされていることを確認します。 たとえば、コンピューターがアイドル状態であるか、ネットワーク接続が必要なスケジュールされたジョブや、長いIdleDurationIdleTimeoutが実行されない場合があります。
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
アクセス許可が不十分なため、スケジュールされたジョブが実行されない可能性があります
スケジュールされたジョブは、ジョブを作成したユーザーのアクセス許可、または または Register-ScheduledJob
コマンドで Set-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 モジュールをインポートするには、Import-Module PSScheduledJob
を入力するか、モジュール内のコマンドレット (Get-ScheduledJob
コマンドレットなど) を実行または取得します。
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