about_Scheduled_Jobs_Troubleshooting
適用対象: Windows PowerShell 3.0
トピック
about_Scheduled_Jobs_Troubleshooting
概要
スケジュールされたジョブで発生する問題の解決方法について説明します。
詳細説明
このセクションでは、Windows PowerShell® のスケジュールされたジョブ機能を使用する場合に発生する可能性のあるいくつかの問題について説明し、これらの問題の解決策を提案します。
Windows PowerShell のスケジュールされたジョブを使用する前に、「about_Scheduled_Jobs」と、スケジュールされたジョブの About トピックを参照してください。
このトピックには、次のセクションが含まれています。
-- ジョブ結果が見つからない
-- スケジュールされたジョブが実行されない
-- スケジュールされたジョブを取得できない: スケジュールされたジョブが破損している
-- Job コマンドレットがスケジュールされたジョブを一貫して検索できない
ジョブ結果が見つからない
-- Windows PowerShell でジョブ結果を取得するための基本的な方法
スケジュールされたジョブが実行されると、スケジュールされたジョブの "インスタンス" が作成されます。スケジュールされたジョブ インスタンスの結果を表示、管理、および取得するには、Job コマンドレットを使用します。
注記:スケジュールされたジョブのインスタンスに対して Job コマンドレットを使用するには、セッションに PSScheduledJob モジュールをインポートする必要があります。PSScheduledJob モジュールをインポートするには、「Import-Module PSScheduledJob」と入力するか、Get-ScheduledJob などのスケジュールされたジョブのコマンドレットを使用します。
スケジュールされたジョブのすべてのインスタンスの一覧を取得するには、Get-Job コマンドレットを使用します。
PS C:\> Import-Module PSScheduledJob PS C:\> 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
次のコマンドは、Format-Table コマンドレットを使用して、テーブルのスケジュールされたジョブ インスタンスの Name、ID、PSBeginTime の各プロパティを表示します。
PS C:\> 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) の最新のインスタンスの結果を取得します。
PS C:\> Receive-Job -ID 50
-- ディスク上のジョブ結果を検索するための基本的な方法
スケジュールされたジョブを管理するには、Get-Job や Receive-Job などの 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
たとえば、次のコマンドはスケジュールされたジョブ ProcessJob のディスク上の実行履歴を取得します。
PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell \ScheduledJobs\ProcessJob\Output 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 ファイルを取得します。
PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs \ProcessJob\Output\*\Results.xml Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell \ScheduledJobs\ProcessJob\Output
Results.xml ファイルが見つからない場合、Windows PowerShell はジョブ結果を返したり、表示したりすることはできません。
-- PSScheduledJob モジュールがセッションにインポートされていないために、Job コマンドレットがスケジュールされたジョブ インスタンスまたはその結果を取得できない場合があります。
注記:スケジュールされたジョブ インスタンスで Job コマンドレットを使用する前に、セッションに PSScheduledJob モジュールが含まれていることを確認してください。このモジュールがない場合、Job コマンドレットはスケジュールされたジョブ インスタンスまたはその結果を取得できません。
PSScheduledJob モジュールをインポートするには、次のように入力します。
Import-Module PSScheduledJob
-- Receive-Job コマンドレットが現在のセッションで結果を既に返している可能性があります。
Receive-Job がジョブ インスタンスの結果を返さない場合は、現在のセッションでそのジョブ インスタンスに対して Receive-Job コマンドが Keep パラメーターなしで既に実行されている可能性があります。
Keep パラメーターなしで Receive-Job を使用した場合、Receive-Job はジョブ結果を返し、ジョブ インスタンスの HasMoreData プロパティを False に設定して、ジョブ インスタンスのすべての結果を既に返しており、これ以上返す結果がないことを示します。この設定は、標準のバックグラウンド ジョブには適していますが、ディスクに保存されているスケジュールされたジョブのインスタンスには適しません。
ジョブ インスタンス結果をもう一度取得するには、新しい Windows PowerShell セッションを開始し ("PowerShell" を引用符なしで入力します)、PSScheduledJob モジュールをインポートし、Receive-Job コマンドを再試行します。
PS C:\> Receive-Job -ID 50 PS C:\> #No results PS C:\> PowerShell Windows PowerShell Copyright (C) 2012 Microsoft Corporation. All rights reserved. PS C:\> Import-Module PSScheduledJob PS C:\> 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 ...
1 つのセッションでジョブ インスタンスの結果を複数回取得するには、Receive-Job コマンドレットの Keep パラメーターを使用します。
PS C:\> Import-Module PSScheduledJob PS C:\> 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 PS C:\> 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
-- スケジュールされたジョブが破損している可能性があります。
スケジュールされたジョブが破損した場合、Windows PowerShell は破損しているスケジュールされたジョブとその結果を削除します。破損しているスケジュールされたジョブ結果を回復することはできません。
スケジュールされたジョブがまだ存在するかどうかを調べるには、Get-ScheduledJob コマンドレットを使用します。
PS C:\> Get-ScheduledJob
-- 結果の数が、スケジュールされたジョブの ExecutionHistoryLength を超えた可能性があります。
スケジュールされたジョブの ExecutionHistoryLength プロパティを使用すると、ディスクに保存されているジョブ インスタンスとその結果の数がわかります。既定値は 32 です。スケジュールされたジョブ インスタンスの数がこの値を超えると、Windows PowerShell は最も古いジョブ インスタンスを削除して、新しい各ジョブ インスタンスを保存するための領域を確保します。
スケジュールされたジョブの ExecutionHistoryLength プロパティの値を取得するには、次のコマンド形式を使用します。
(Get-ScheduledJob <JobName>).ExecutionHistoryLength
たとえば、次のコマンドはスケジュールされたジョブ ProcessJob の ExecutionHistoryLength プロパティの値を取得します。
PS C:\> (Get-ScheduledJob ProcessJob).ExecutionHistoryLength
ExecutionHistoryLength プロパティの値を設定または変更するには、Register-ScheduledJob コマンドレットおよび Set-ScheduledJob コマンドレットの MaxResultCount パラメーターを使用します。
次のコマンドは、ExecutionHistoryLength プロパティの値を 50 に増やします。
PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
-- ジョブ インスタンス結果が削除された可能性があります。
Set-ScheduledJob コマンドレットの ClearExecutionHistory パラメーターは、ジョブの実行履歴を削除します。この機能を使用すると、ディスク領域を解放したり、不要な結果、既に使用されている結果、分析済みの結果、または別の場所に保存されている結果を削除したりできます。
スケジュールされたジョブの実行履歴を削除するには、スケジュールされたジョブの ClearExecutionHistory パラメーターを使用します。
次のコマンドは、スケジュールされたジョブ ProcessJob の実行履歴を削除します。
PS C:\> 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)、セッションを閉じるか、Windows PowerShell を閉じた場合は、ジョブ インスタンスとその結果が削除されます。
スケジュールされたジョブが実行されない
-- ジョブ トリガーまたはスケジュールされたジョブが無効である場合、スケジュールされたジョブは自動的に実行されません。
Get-ScheduledJob コマンドレットを使用して、スケジュールされたジョブを取得します。スケジュールされたジョブの Enabled プロパティの値が True ($true) であることを確認してください。
PS C:\> Get-ScheduledJob ProcessJob Id Name Triggers Command Enabled -- ---- -------- ------- ------- 4 ProcessJob {1, 2} Get-Process True PS C:\> (Get-ScheduledJob ProcessJob).Enabled True
Get-JobTrigger コマンドレットを使用して、スケジュールされたジョブのジョブ トリガーを取得します。ジョブ トリガーの Enabled プロパティの値が True ($true) であることを確認してください。
PS C:\> 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 PS C:\> Get-ScheduledJob ProcessJob | Get-JobTrigger | Format-Table ID, Enabled -Auto Id Enabled -- ------- 1 True 2 True
-- ジョブ トリガーが有効でない場合、スケジュールされたジョブは自動的に実行されません。
たとえば、ジョブ トリガーに過去の日付または存在しない日付 (月の第 5 月曜日など) が指定される場合があります。
-- ジョブ トリガーまたはジョブ オプションの条件が満たされない場合、スケジュールされたジョブは自動的に実行されません。
たとえば、特定のユーザーがコンピューターにログオンしているときにのみ実行されるスケジュールされたジョブは、そのユーザーがログオンしていない場合やリモートから接続しているだけである場合には実行されません。
スケジュールされたジョブのオプションを確認し、満たされているどうかを確認してください。たとえば、スケジュールされたジョブを実行するにはコンピューターがアイドル状態であることやネットワーク接続が必要である場合、あるいはスケジュールされたジョブの IdleDuration が長かったり、IdleTimeout が短かったりする場合、ジョブは実行されない可能性があります。
Get-ScheduledJobOption コマンドレットを使用して、ジョブ オプションとその値を確認してください。
PS C:\> 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 コマンドレットのヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=223919) を参照してください。
-- スケジュールされたジョブ インスタンスが失敗した可能性があります。
スケジュールされたジョブのコマンドが失敗した場合、Windows PowerShell はエラー メッセージを生成してすぐにそのことを報告します。ただし、タスク スケジューラが実行しようとしたときにジョブが失敗した場合は、Windows PowerShell にエラーが返されません。
次の方法を使用して、ジョブの失敗を検出して修正してください。
-- タスク スケジューラのイベント ログでエラーを確認します。ログをチェックするには、イベント ビューアーを使用するか、または次のように Windows PowerShell コマンドを使用します。
Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational | Where {$_.Message -like "*fail*"}
タスク スケジューラでジョブ レコードを確認します。Windows PowerShell のスケジュールされたジョブは、タスク スケジューラ用の次のフォルダーに格納されます。
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
-- アクセス許可が十分でないために、スケジュールされたジョブが実行されない可能性があります。
スケジュールされたジョブは、ジョブを作成したユーザーのアクセス許可か、または Register-ScheduledJob コマンドまたは Set-ScheduledJob コマンドの Credential パラメーターに指定されているユーザーのアクセス許可で実行されます。
そのユーザーがコマンドまたはスクリプトを実行するアクセス許可を持っていない場合は、ジョブが失敗します。
スケジュールされたジョブを取得できない: スケジュールされたジョブが破損している
まれに、スケジュールされたジョブが破損する場合や、解決できない内部不一致を含む場合があります。通常、このようになるのは、スケジュールされたジョブ用の XML ファイルを手動で編集したために無効な XML が生成されたときです。
スケジュールされたジョブが破損した場合、Windows PowerShell はスケジュールされたジョブ、その実行履歴、およびその結果をディスクから削除しようとします。
スケジュールされたジョブが削除されなかった場合は、Get-ScheduledJob コマンドレットを実行するたびに、ジョブが破損しているというエラー メッセージが表示されます。
破損しているスケジュールされたジョブを削除するには、次のいずれかの方法を使用します。ここにセクション本体を挿入します。
-- スケジュールされたジョブの <ScheduledJobName> ディレクトリを削除します。ScheduledJob ディレクトリは削除しないでください。
ディレクトリは、$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName> にあります。
通常:
C:\Users\<UserName>\AppData\Local\Microsoft\Windows\PowerShell \ScheduledJobs\<ScheduledJobName>.
-- タスク スケジューラを使用して、スケジュールされたジョブを削除します。Windows PowerShell のスケジュールされたタスクは、次のタスク スケジューラ パスに表示されます。
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName>
Job コマンドレットがスケジュールされたジョブを一貫して検索できない
PSScheduledJob モジュールが現在のセッションにない場合、Job コマンドレットはスケジュールされたジョブを取得することも、開始することも、その結果を取得することもできません。
PSScheduledJob モジュールをインポートするには、"Import-Module PSScheduledJob" を入力するか、または Get-ScheduledJob コマンドレットなどのモジュール内のコマンドレットを実行または取得します。Windows PowerShell 3.0 以降では、モジュール内のコマンドレットを取得または使用すると、モジュールが自動的にインポートされます。
PSScheduledJob コマンドレットが現在のセッションにない場合、次のコマンド シーケンスを使用できます。
PS C:\> 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
PS C:\> Get-Job
PS C:\> Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1} Get-Process True
PS C:\> 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
about_Scheduled_Jobs_Basics
about_Scheduled_Jobs_Advanced