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


about_Scheduled_Jobs_Troubleshooting

Краткое описание

Описание устранения проблем с запланированными заданиями

Подробное описание

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

Прежде чем использовать запланированные задания PowerShell, ознакомьтесь с about_Scheduled_Jobs и соответствующими запланированными заданиями о разделах.

Дополнительные сведения о командлетах, содержащихся в модуле PSScheduledJob , см. в разделе PSScheduledJob.

Не удается найти результаты задания

Базовый метод получения результатов задания в PowerShell

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

Примечание.

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

Если 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 в каталоге с именем timestamp.

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

Примечание.

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

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

Import-Module PSScheduledJob

Командлет Get-Job, возможно, уже вернул результаты

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

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

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

(Get-ScheduledJob ProcessJob).ExecutionHistoryLength

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

Следующая команда увеличивает значение свойства ExecutionHistoryLength до 50.

Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50

Результаты экземпляра задания могут быть удалены

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

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

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

Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory

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

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

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

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

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

Запланированное задание не выполняется

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

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-ScheduledJob командеRegister-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 , а затем выполняет команду.

См. также