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

How can I remove a trigger from a scheduled task

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

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

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

PowerShell cmdlet 似乎没有办法做到这一点。 任何帮助将不胜感激。

似乎没有用于删除触发器的 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 子句以更少的行来完成,但我总是需要更长的时间才能做到这一点,所以我只是循环遍历所有内容,只要它会影响很小。