Поделиться через


about_Scheduled_Jobs_Troubleshooting

Назначение: Windows PowerShell 3.0

РАЗДЕЛ

about_Scheduled_Jobs_Troubleshooting

КРАТКОЕ ОПИСАНИЕ

Описываются способы решения проблем, связанных с запланированными заданиями.

ПОДРОБНОЕ ОПИСАНИЕ

В этом разделе описываются некоторые проблемы, которые могут возникать при использовании функций запланированных заданий в Windows PowerShell®, и предлагаются решения этих проблем.

Перед использованием запланированных заданий Windows PowerShell ознакомьтесь с разделом about_Scheduled_Jobs и связанными разделами о запланированных заданиях.

В этом разделе содержатся следующие подразделы.

  • НЕ УДАЕТСЯ НАЙТИ РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ЗАДАНИЯ

  • ЗАПЛАНИРОВАННОЕ ЗАДАНИЕ НЕ ВЫПОЛНЯЕТСЯ

  • НЕ УДАЕТСЯ ПОЛУЧИТЬ ЗАПЛАНИРОВАННОЕ ЗАДАНИЕ: ЗАПЛАНИРОВАННОЕ ЗАДАНИЕ ПОВРЕЖДЕНО

  • КОМАНДЛЕТАМ ЗАДАНИЙ НЕ УДАЕТСЯ НАЙТИ ЗАПЛАНИРОВАННЫЕ ЗАДАНИЯ

НЕ УДАЕТСЯ НАЙТИ РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ЗАДАНИЯ

  • Базовый метод для получения результатов выполнения задания в 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
    
  • – Основной способ поиска результатов выполнения задания на диске

    Для управления запланированными заданиями используйте командлеты Job, такие как 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
    

    Например, приведенная ниже команда возвращает находящийся на диске журнал выполнения запланированного задания 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 в каталоге с именем в виде метки времени.

    Например, приведенная ниже команда возвращает файлы Results.xml для каждого сохраненного экземпляра запланированного задания ProcessJob.

            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 не может вернуть или вывести результаты выполнения задания.

  • – Командлету Job не удалось получить экземпляры запланированного задания или их результаты, так как модуль PSScheduledJob не импортирован в сеанс.

    ПРИМЕЧАНИЕ. Перед использованием командлета Job применительно к экземплярам запланированного задания убедитесь в том, что модуль PSScheduledJob включен в сеанс. Без этого модуля командлеты Job не могут получить экземпляры запланированного задания или их результаты.

    Чтобы импортировать модуль PSScheduledJob, введите следующую команду:

               Import-Module PSScheduledJob
    
  • – Командлет Receive-Job, возможно, уже вернул результаты в текущем сеансе.

    Если командлет Receive-Job не возвращает результаты выполнения экземпляра задания, возможно, он уже был выполнен для этого экземпляра в текущем сеансе без параметра Keep.

    При использовании командлета Receive-Job без параметра Keep он возвращает результаты выполнения задания и присваивает свойству 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
               ...
    

    Чтобы получить результаты выполнения экземпляра задания несколько раз за сеанс, используйте параметр Keep командлета Receive-Job.

               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
    

    Например, приведенная ниже команда возвращает значение свойства ExecutionHistoryLength запланированного задания ProcessJob.

               PS C:\> (Get-ScheduledJob ProcessJob).ExecutionHistoryLength
    

    Чтобы задать или изменить значение свойства ExecutionHistoryLength, используйте параметр MaxResultCount командлетов Register-ScheduledJob и Set-ScheduledJob.

    Приведенная ниже команда увеличивает значение свойства ExecutionHistoryLength до 50.

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
    
  • – Результаты выполнения экземпляра задания, возможно, удалены.

    Параметр ClearExecutionHistory командлета Set-ScheduledJob приводит к удалению журнала выполнения задания. Это позволяет освободить место на диске или удалить результаты, которые не нужны, уже были проанализированы или сохранены в другом месте.

    Чтобы удалить журнал выполнения запланированного задания, используйте параметр ClearExecutionHistory запланированного задания.

    Приведенная ниже команда удаляет журнал выполнения запланированного задания ProcessJob.

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
    

    Кроме того, удалить результаты задания можно с помощью командлета Remove-Job. При использовании командлета Remove-Job для удаления запланированного задания удаляются все экземпляры задания на диске, включая журнал выполнения и все результаты выполнения задания.

  • – Задания, запущенные с помощью командлета Start-Job, не сохраняются на диске.

    При запуске запланированного задания с помощью командлета Start-Job, а не триггера задания, запускается стандартное фоновое задание. Фоновое задание и его результаты не сохраняются в журнале выполнения задания на диске.

    Вы можете получить задание с помощью командлета Get-Job и результаты выполнения задания с помощью командлета Receive-Job, но результаты доступны только до момента их получения, если только не используется параметр Keep командлета Receive-Job.

    Кроме того, фоновые задания и их результаты привязаны к сеансу. Они существуют только в сеансе, в котором были созданы. При удалении задания (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
    
  • – Запланированные задания не запускаются автоматически, если триггеры задания недопустимы.

    Например, в триггере задания может быть указана дата в прошлом или несуществующая дата, например пятый понедельник месяца.

  • – Запланированные задания не запускаются автоматически, если не выполняются условия триггера задания или параметры задания.

    Например, запланированное задание, которое запускается только при входе определенного пользователя в систему, не будет выполняться, если этот пользователь не выполняет вход или подключается только удаленно.

    Проверьте параметры запланированного задания и убедитесь в том, что они могут выполняться. Например, запланированное задание, которое требует сетевого подключения либо для которого установлено слишком большое значение 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
      
  • – Запланированное задание могло не запуститься из-за отсутствия разрешения.

    Запланированные задания выполняются с разрешениями пользователя, создавшего задание или указанного в параметре Credential команды Register-ScheduledJob или Set-ScheduledJob.

    Если у этого пользователя нет разрешения на выполнение команд или сценариев, задание не запускается.

НЕ УДАЕТСЯ ПОЛУЧИТЬ ЗАПЛАНИРОВАННОЕ ЗАДАНИЕ: ЗАПЛАНИРОВАННОЕ ЗАДАНИЕ ПОВРЕЖДЕНО

В редких случаях запланированные задания могут быть повреждены или содержать внутренние противоречия, которые невозможно разрешить. Как правило, это происходит по причине изменения XML-файлов запланированного задания вручную, в результате чего код XML оказывается недопустимым.

При повреждении запланированного задания Windows PowerShell пытается удалить его, а также его журнал выполнения и результаты с диска.

Если удалить задание не удастся, вы будете получать сообщение о повреждении задания при каждом выполнении командлета Get-ScheduledJob.

Чтобы удалить поврежденное запланированное задание, используйте один из описанных ниже методов. Вставить здесь текст раздела.

  • – Удалите каталог <Имя_запланированного_задания>. Не удаляйте каталог ScheduledJob.

    Этот каталог находится по пути $env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\<Имя_запланированного_задания>

    Обычно:

           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