Share via


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-ScheduledJobRegister-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 モジュールが自動的にインポートされ、コマンドが実行されるために発生します。

関連項目