我在PowerShell中使用Task Scheduler cmdlet为Perfmon Data Collector集的计划任务配置触发器。 我使用以下命令修改计划任务并在服务器启动时启动数据收集器集:
$trigger = New-ScheduledTaskTrigger -AtStartup
Set-ScheduledTask -TaskPath '\Microsoft\Windows\PLA\' -Taskname $TemplateName -Trigger $trigger
但我想知道是否有办法从计划任务配置中删除此触发器。我不想禁用“计划”任务,只是想从计划任务中删除此触发器。
看起来有一种方法可以从PowerShell cmdlet中执行此操作。 任何帮助将不胜感激。
答案 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
子句可以用更少的行来完成,但是为了做到这一点总是需要更长的时间,所以我只需要循环使用它就可以了。这是一个影响很小的东西。