次の方法で共有


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 コマンドレットは、スケジュールされたジョブ インスタンスの NameId、および 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-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 コマンドレットは、スケジュールされたジョブ 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

たとえば、次のコマンドは、スケジュールされたジョブの ProcessJobExecutionHistoryLength プロパティの値を取得します。

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

関連項目