2016-06-16 13 views
3

PowerShellのタスクスケジューラコマンドレットを使用して、Perfmon Data Collectorセットのスケジュールされたタスクのトリガーを構成しています。 私は、スケジュールされたタスクを変更し、サーバの起動時にデータコレクタセットを開始するには、以下を使用しています:スケジュールされたタスクからトリガーを削除する方法

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

をしかし、私はスケジュールされたタスクの設定からこのトリガーを除去する方法があるかどうかを知りたいです。私はスケジュールされたタスクを無効にしたくないだけで、スケジュールされたタスクからこのトリガを削除したいだけです。

PowerShellコマンドレットからこれを行う方法がないように見えます。 助けていただければ幸いです。

答えて

4

トリガを削除するPowerShellコマンドレットは表示されませんが、Schedule.Service COMオブジェクトを通じて実行できます。次の例では、MyTaskという名前のタスクから最初のトリガーを削除します。

開始時刻やその他の基準に基づいて削除する特定のトリガを見つけるために、トリガを調べるためにループを追加する必要があります。

注:トリガ列挙は一基づいて、ゼロベースではないので、最初のトリガを削除するには、このくらいのためChanging Scheduled Tasks with PowerShellから$definition.Triggers.Remove(1)

クレジットです。特に「AtStartup」トリガされているすべてのトリガーを削除するには

$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) 

、以下で# 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句に配管少ない線で行うことができると確信しているが、それはいつものように長い間、それは最小限になります何かのように、物事を通して右ので、私はちょうどループすることを得るために長い私を取ります影響。

+0

はいこれはうまくいきます。 ご協力いただきありがとうございます、本当に感謝しています! – rapturesque

+0

ループ内に小さなエラーがあり、すべてのスタートアップタイプのトリガが削除されていましたが、複数のスタートアップタイプのトリガがある場合は、それらのうちの1つだけを削除していました。 $ definition.Triggers.Remove($ triggerId)を実行すると、そのトリガーが削除された後、トリガーカウントが1ずつ下がり、トリガーのIDも変更され、1減算されます。 これにより、ループ削除した直後のトリガーはチェックしません。 – rapturesque

+1

これを修正するには、次のように修正しました。 'for($ triggerId = 1; $ triggerId -le $ definition.Triggers.Count; $ triggerId ++){ if($ definition.Triggers.Item($ triggerId)タイプ-eq "8"){ $ definition.Triggers.Remove($ triggerId); $ triggerId- = 1; } } ' – rapturesque

関連する問題