我在 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 子句用更少的行来完成,但是我总是需要更长的时间才能做到这一点,所以我只是循环处理,只要它的影响最小。

关于powershell - 如何从计划任务中删除触发器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37864480/

10-13 07:46
查看更多