about_Scheduled_Jobs_Troubleshooting
应用到: Windows PowerShell 3.0, Windows PowerShell 4.0
主题
about_Scheduled_Jobs_Troubleshooting
简短说明
说明如何解决有关计划作业的问题
详细说明
本部分介绍一些你在使用 Windows PowerShell® 的计划作业功能时可能遇到的问题,并且提出针对这些问题的建议解决方案。
在使用 Windows PowerShell 计划作业前,请参阅 about_Scheduled_Jobs 和相关计划作业 about 主题。
本主题包含以下部分:
-- 找不到作业结果
-- 计划作业无法运行
-- 无法获取计划作业:计划作业已损坏
-- JOB CMDLET 无法一致地找到计划作业
找不到作业结果
-- 获取 Windows PowerShell 中的作业结果的基本方法
当计划作业运行时,它将创建计划作业的“实例”。若要查看、管理和获取计划作业实例的结果,请使用 Job cmdlet。
注意:若要在计划作业的实例上使用 Job cmdlet,PSScheduledJob 模块必须导入到会话中。若要导入 PSScheduledJob 模块,请键入“Import-module PSScheduledJob”(不带引号)或使用任何 Scheduled Job cmdlet,如 Get-ScheduledJob。
若要获取计划作业的所有实例的列表,请使用 Get-Job cmdlet。
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 cmdlet 在表中显示计划作业实例的 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 cmdlet.以下命令获取 ProcessJob (ID = 50) 的最新实例的结果。
PS C:\> Receive-Job -ID 50
-- 用于查找磁盘上的作业结果的基本方法
若要管理计划作业,请使用 Job cmdlet,例如 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 文件中。
例如,以下命令获取 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 无法返回或显示作业结果。
-- Job cmdlet 可能无法获取计划作业实例或其结果,因为 PSScheduledJob 模块未导入到会话中。
注意:在对计划作业实例使用 Job cmdlet 前,请验证 PSScheduledJob 模块是否包含在会话中。在没有模块的情况下,Job cmdlet 无法获取计划作业实例或其结果。
若要导入 PSScheduledJob 模块,请键入:
Import-Module PSScheduledJob
-- Receive-Job cmdlet 可能已在当前会话中返回结果。
如果 Receive-Job 未返回作业实例结果,则可能是因为已在没有 Keep 参数的情况下在当前会话中为该作业实例运行 Receive-Job 命令。
当在没有 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 ...
若要在会话中多次获取作业实例的结果,请使用 Receive-Job cmdlet 的 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 cmdlet。
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 cmdlet 的 MaxResultCount 参数。
以下命令将 ExecutionHistoryLength 属性的值增加到 50。
PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
-- 作业实例结果可能已删除
Set-ScheduledJob cmdlet 的 ClearExecutionHistory 参数将删除作业的执行历史记录。可以使用此功能释放磁盘空间或删除不需要或已使用、分析或保存在不同位置的结果。
若要删除计划作业的执行历史记录,请使用计划作业的 ClearExecutionHistory 参数。
以下命令删除 ProcessJob 计划作业的执行历史记录。
PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
此外,Remove-Job cmdlet 删除作业结果。使用 Remove-Job 删除计划作业时,它会删除磁盘上的作业的所有实例,包括执行历史记录和所有作业结果。
-- 使用 Start-Job cmdlet 启动的作业不会保存到磁盘。
使用 Start-Job 而不是使用作业触发器启动作业时,Start-Job 将启动标准后台作业。后台作业及其结果不存储在磁盘上的作业的执行历史记录中。
你可以使用 Get-Job cmdlet 获取作业并使用 Receive-Job cmdlet 获取作业结果,但结果仅在你收到它们之后可用,除非你使用 Receive-Job cmdlet 的 Keep 参数。
此外,后台作业及其结果特定于会话;它们仅存在于创建它们的会话中。如果你删除作业 (Remove-Job)、关闭会话或关闭 Windows PowerShell,将删除作业实例及其结果。
计划作业无法运行
-- 如果已禁用作业触发器或计划作业,则计划作业不会自动运行。
使用 Get-ScheduledJob cmdlet 获取计划作业。验证计划作业的 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 cmdlet 获取计划作业的作业触发器。验证作业触发器的 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 cmdlet 检查作业选项及其值。
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 cmdlet 的帮助主题 (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 cmdlet 时都将收到损坏作业错误消息。
若要删除已损坏的计划作业,请使用以下方法之一。在此处插入部分正文。
-- 删除该计划作业的 <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 CMDLET 无法一致地找到计划作业
当 PSScheduledJob 模块不在当前会话中时,Job cmdlet 无法获取计划作业、启动它们或获取其结果。
若要导入 PSScheduledJob 模块,请键入“Import-module PSScheduledJob”或者运行或获取模块中的任何 cmdlet,如 Get-ScheduledJob cmdlet。从 Windows PowerShell 3.0 开始,当你获取或使用模块中的任何 cmdlet 时,将自动导入模块。
当 PSScheduledJob cmdlet 不在当前会话中时,以下命令序列可行。
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