使用PowerShell禁用任务计划触发器无效,寻求解决方法
任务计划程序触发器修改不生效的问题及解决办法
问题说明
公司新软件与任务计划程序中的现有任务存在交互问题,编写PowerShell脚本调整设置时,唯独无法修改登录触发器的启用状态:能正常获取触发器的全部信息,但修改操作仅在脚本内显示生效,任务计划程序中仍显示触发器“已启用”,且触发器会正常触发任务。
已尝试的代码
COM对象实现方式
$taskName = 'TEST' $triggerToDelete = 1 $computerName = "LAPTOP" $TaskScheduler = New-Object -com("Schedule.Service") $TaskScheduler.Connect() $TaskFolder = $TaskScheduler.GetFolder("\") $Task = $TaskFolder.GetTask($taskName) $Triggers = $Task.Definition.Triggers $FirstTrigger = $Triggers.Item(1) # 获取任务定义并修改 $definition = $task.Definition $definition.Triggers.Item(1).enabled = $false
PowerShell Cmdlet实现方式
$Task = Get-ScheduledTask -TaskName 'TEST' $Trigger = $Task.Triggers[0] $Trigger.Enabled = $false $Trigger
出现的现象
执行代码后,脚本输出显示触发器已禁用:
Enabled : False EndBoundary : ExecutionTimeLimit : Id : Repetition : MSFT_TaskRepetitionPattern StartBoundary : 2023-09-13T19:00:00 DaysInterval : 1 RandomDelay : PSComputerName :
但任务计划程序界面中该触发器仍处于“已启用”状态,且到设定时间会正常触发任务。
解决方案
问题核心是修改任务定义后未保存更改,无论使用哪种方式修改触发器,都需要将更新后的任务配置重新注册到任务计划程序中:
方案1:使用PowerShell Cmdlet(推荐)
$taskName = 'TEST' # 获取目标任务对象 $task = Get-ScheduledTask -TaskName $taskName # 禁用第一个触发器 $task.Triggers[0].Enabled = $false # 保存修改到任务计划程序 Set-ScheduledTask -InputObject $task
方案2:使用COM对象
$taskName = 'TEST' $computerName = "LAPTOP" $TaskScheduler = New-Object -com("Schedule.Service") $TaskScheduler.Connect($computerName) $TaskFolder = $TaskScheduler.GetFolder("\") # 获取任务及当前定义 $task = $TaskFolder.GetTask($taskName) $definition = $task.Definition # 禁用指定触发器 $definition.Triggers.Item(1).Enabled = $false # 重新注册任务以保存更改(参数6表示创建或更新任务,其余参数沿用原任务设置) $TaskFolder.RegisterTaskDefinition($taskName, $definition, 6, $null, $null, $null)
内容的提问来源于stack exchange,提问作者QLN
相关产品推荐
相关产品推荐

