似乎没有用于删除触发器的 PowerShell cmdlet,但您可以通过 Schedule.Service COM 对象来执行此操作。以下示例将从名为 MyTask 的任务中删除第一个触发器。
您可能需要添加一个循环来检查触发器,以便根据开始时间或其他条件找到要删除的特定触发器。
Note:触发器枚举是从一开始的,而不是从零开始的,因此要删除第一个触发器,$definition.Triggers.Remove(1)
归功于使用 PowerShell 更改计划任务 http://powershell.com/cs/blogs/tips/archive/2013/06/21/changing-scheduled-tasks-with-powershell.aspx对于这其中的大部分。
$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
子句,但我总是需要更长的时间才能做到这一点,所以我只是循环遍历所有内容,只要它的影响最小。