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 возвращает результаты задания и задает для экземпляра задания значение Receive-Job
.Receive-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
Следующая команда увеличивает значение свойства ExecutionHistoryLength до 50.
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
Результаты экземпляра задания могут быть удалены
Параметр командлета удаляет журнал выполнения задания. Эту функцию можно использовать для освобождения места на диске или удаления результатов, которые не нужны или уже использованы, проанализированы или сохранены в другом расположении.
Чтобы удалить журнал выполнения запланированного задания, используйте параметр 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 в или 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 , а затем выполняет команду.
См. также
PowerShell