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