如何从计划任务中删除触发器

时间:2016-06-16 16:18:32

标签: powershell scheduled-tasks

我在PowerShell中使用Task Scheduler cmdlet为Perfmon Data Collector集的计划任务配置触发器。 我使用以下命令修改计划任务并在服务器启动时启动数据收集器集:

$trigger = New-ScheduledTaskTrigger -AtStartup
Set-ScheduledTask -TaskPath '\Microsoft\Windows\PLA\' -Taskname $TemplateName -Trigger $trigger

但我想知道是否有办法从计划任务配置中删除此触发器。我不想禁用“计划”任务,只是想从计划任务中删除此触发器。

看起来有一种方法可以从PowerShell cmdlet中执行此操作。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

似乎没有用于删除触发器的PowerShell cmdlet,但您可以通过Schedule.Service COM对象执行此操作。以下示例将从名为MyTask的任务中删除第一个触发器。

您可能需要添加一个循环来检查触发器,以便根据开始时间或其他条件找到您要删除的特定触发器。

注意:触发器枚举是从一开始的,而不是从零开始的,所以要删除第一个触发器$definition.Triggers.Remove(1)

大部分内容归功于Changing Scheduled Tasks with PowerShell

$taskName = "MyTask"
$triggerToDelete = 1

# connect to Task Scheduler:
$service = New-Object -ComObject Schedule.Service
$service.Connect($env:COMPUTERNAME)

# pick a specific task in a container:
$folder = $service.GetFolder('\')
$task = $folder.GetTask($taskName)

# get task definition and change it:
$definition = $task.Definition
$definition.Triggers.Remove($triggerToDelete)

# write back changed task definition:
# 4 = Update
$folder.RegisterTaskDefinition($task.Name, $definition, 4, $null, $null, $null)

专门删除所有触发器" AtStartup"触发器,使用以下内容替换# get task definition and change it:部分。请注意,它会向后循环触发器,因为如果删除了一个触发器,则任何后续触发器的ID都会更改。

# get task definition and change it:
$definition = $task.Definition

$numTriggers = $definition.Triggers.Count

# loop backwards through the triggers and 
# remove any that are "Startup" (Type = 8)
for($triggerId=$numTriggers; $triggerId -gt 0; $triggerId--){
    if($definition.Triggers.Item($triggerId).Type -eq "8"){
        $definition.Triggers.Remove($triggerId)
    }
}

我确信通过管道到where子句可以用更少的行来完成,但是为了做到这一点总是需要更长的时间,所以我只需要循环使用它就可以了。这是一个影响很小的东西。