【问题标题】:How can I remove a trigger from a scheduled task如何从计划任务中删除触发器
【发布时间】:2016-06-16 16:18:31
【问题描述】:

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

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

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

似乎没有办法通过 PowerShell cmdlet 执行此操作。 任何帮助将不胜感激。

【问题讨论】:

    标签: powershell scheduled-tasks


    【解决方案1】:

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

    【讨论】:

    • 是的,这很好。非常感谢您的所有帮助,非常感谢!
    • 虽然我确实在删除所有启动类型触发器的循环中发现了一个小错误,但如果有多个启动类型触发器,它只是删除其中一个,而不是全部。当您执行 $definition.Triggers.Remove($triggerId) 时,在删除该触发器后,触发器计数减少 1,触发器的 id 也发生变化,减去 1。因此,循环不会t 在刚刚移除的触发器之后立即检查触发器。
    • 为了更正它,我这样修改:for($triggerId=1; $triggerId -le $definition.Triggers.Count; $triggerId++){ if($definition.Triggers.Item($triggerId).Type -eq "8"){ $definition.Triggers.Remove($triggerId); $triggerId-=1; } }
    • 好收获。我假设只有一个启动触发器,因为有两个没有多大意义,但肯定可以有两个!
    • 这不适用于某些计划任务 - 即使您在提升模式下运行 powershell,例如\Microsoft\Windows\UpdateOrchestrator\UpdateModelTask​​.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多