web-dev-qa-db-ja.com

毎日のトリガーと繰り返し間隔でスケジュールされたタスク

毎日トリガーされ、30分ごとに繰り返される新しいスケジュールされたタスクを作成する方法を理解できないようです。私は輪になってきた。

以下のこれに関するすべては、私が望むタスクを設定するために機能しますが、一度だけトリガーされます。

#Credentials to run task as
$username = "$env:USERDOMAIN\$env:USERNAME" #current user
$password = "notmypass"

#Location of Scripts:
$psscript = "C:\test\test.ps1"
$Sourcedir ="C:\testsource\"
$destdir = "C:\testdest\"
$archivepassword = "notmypass"


####### Create New Scheduled Task
$action = New-ScheduledTaskAction -Execute "Powershell" -Argument "-WindowStyle Hidden `"$psscript `'$sourcedir`' `'$destdir`' `'$archivepassword`'`""
$trigger = New-ScheduledTaskTrigger -Once -At 7am -RepetitionDuration  (New-TimeSpan -Days 1)  -RepetitionInterval  (New-TimeSpan -Minutes 30)
$settings = New-ScheduledTaskSettingsSet -Hidden -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable
$ST = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask EncryptSyncTEST -InputObject $ST -User $username -Password $password

-Once-Dailyに変更すると、-RepetitionIntervalフラグが失われます。そして、登録後にタスクを毎日に更新するために戻った場合、繰り返しトリガーを消去します。

これは珍しいスケジューリング方法ではなく、タスクスケジューラUIを使用して簡単に適用できます。おそらくシンプルな気がしますが、見逃しています。

どんな助けも大歓迎です。

EDIT:重複した質問への対処。投稿の質問「 Powershell v3 New-JobTrigger daily with repeat 」は同じことを求めています。しかし、以前にコメントしたように、答えはどれも問題を解決しません。マークされた答えは、私がすでに持っているものとまったく同じです。-Onceトリガーでタスクを設定し、1日間5分ごとに繰り返すように更新します。初日以降、そのタスクは二度とトリガーされません。次のトリガーまでの繰り返しと期間で毎日タスクをトリガーする問題に対処していません。

その投稿の他の3つの回答も質問に対応していません。それが正しいとは限らないので、なぜそれが回答とマークされたのか分かりません。この質問を投稿する前に、これらの応答を完全に調査しました。この投稿は古くなっており、回答済みとマークされているため、この質問を作成しました。

:私は回避策を見つけましたが、素晴らしいものではありません。現在のところ、powershellを使用してカスタムトリガーを定義する最も簡単な方法は、Scheduled Task XMLを操作し、Register-ScheduledTaskを使用して直接インポートすることです

19
malexander

より良い方法があるはずですが、これは私の現在の回避策です。

必要なトリガーを使用してタスクを作成し、生成されたXMLを取得しました。

以下では、タスクを作成し、その新しいタスクのXMLを取得し、トリガーを置き換え、タスクの登録を解除して、更新されたXMLで再登録します。

長期的には、おそらくタスクに完全なXMLファイルを使用し、必要に応じて文字列を置き換えますが、これは今のところ機能します。

#Credentials to run task as
$username = "$env:USERDOMAIN\$env:USERNAME" #current user
$password = "notmypass"

#Location of Scripts:
$psscript = "C:\test\test.ps1"
$Sourcedir ="C:\testsource\"
$destdir = "C:\testdest\"
$archivepassword = "notmypass"

####### Create New Scheduled Task
$action = New-ScheduledTaskAction -Execute "Powershell" -Argument "-WindowStyle Hidden '$EncryptSync' '$sourcedir' '$destdir' '$archivepassword'"
$trigger = New-ScheduledTaskTrigger -Once -At 7am -RepetitionDuration  (New-TimeSpan -Days 1)  -RepetitionInterval  (New-TimeSpan -Minutes 30)
$settings = New-ScheduledTaskSettingsSet -Hidden -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable
$ST = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask "EncryptSyncTEST" -InputObject $ST -User $username -Password $password


[xml]$EncryptSyncST = Export-ScheduledTask "EncryptSyncTEST"
$UpdatedXML = [xml]'<CalendarTrigger xmlns="http://schemas.Microsoft.com/windows/2004/02/mit/task"><Repetition><Interval>PT30M</Interval><Duration>P1D</Duration><StopAtDurationEnd>false</StopAtDurationEnd></Repetition><StartBoundary>2013-11-18T07:07:15</StartBoundary><Enabled>true</Enabled><ScheduleByDay><DaysInterval>1</DaysInterval></ScheduleByDay></CalendarTrigger>'
$EncryptSyncST.Task.Triggers.InnerXml = $UpdatedXML.InnerXML

Unregister-ScheduledTask "EncryptSyncTEST" -Confirm:$false
Register-ScheduledTask "EncryptSyncTEST" -Xml $EncryptSyncST.OuterXml -User $username -Password $password
10
malexander

スケジュールされたタスクトリガーのPowerShellインターフェイスは制限されていますが、RepetitionDuration[System.TimeSpan]::MaxValueに設定すると、結果は "無期限"になります。

$trigger = New-ScheduledTaskTrigger `
    -Once `
    -At (Get-Date) `
    -RepetitionInterval (New-TimeSpan -Minutes 5) `
    -RepetitionDuration ([System.TimeSpan]::MaxValue)

Windows Server 2012 R2(PowerShell 4.0)でテスト済み

17

Powershell(私のマシンではv5、YMMV)で12AM、毎日、および1日ごとに繰り返しその日の残りの時間したがって、無期限に実行されます。トリガーはタスクスケジューラに次のように表示されるため、前述のように-RepetitionDuration([timespan]::MaxValue)に設定するよりも優れたアプローチだと思います。

毎日午前12:00-トリガー後、30分間ごとに1日間繰り返します。

タスクが登録された日付が-Once -At 12amを使用するアプローチとしてトリガーに表示されるのではなく、単純な-Daily -At 12amとしてトリガーを作成し、タスクを登録してから、タスクのいくつかのプロパティにアクセスします。プロパティ;

$action = New-ScheduledTaskAction -Execute <YOUR ACTION HERE>
$trigger = New-ScheduledTaskTrigger -Daily -At 12am
$task = Register-ScheduledTask -TaskName "MyTask" -Trigger $trigger -Action $action
$task.Triggers.Repetition.Duration = "P1D" //Repeat for a duration of one day
$task.Triggers.Repetition.Interval = "PT30M" //Repeat every 30 minutes, use PT1H for every hour
$task | Set-ScheduledTask
//At this point the Task Scheduler will have the desirable description of the trigger.
12
James Webster

これを達成するために見つけた最も簡単な方法は、schtasks.exeを使用することです。 https://msdn.Microsoft.com/en-us/library/windows/desktop/bb736357%28v=vs.85%29.aspx で完全なドキュメントを参照してください

schtasks.exe /CREATE /SC DAILY /MO 1 /TN 'task name' /TR 'powershell.exe C:\test.ps1' /ST 07:00 /RI 30 /DU 24:00

これにより、毎日実行され、30分ごとに1日間繰り返されるタスクが作成されます。

5
llamb

別の方法は、次のように複数のトリガーを作成することです。

$startTimes     = @("12:30am","6am","9am","12pm","3pm","6pm")
$triggers = @()
foreach ( $startTime in $startTimes )
{
    $trigger = New-ScheduledTaskTrigger -Daily -At $startTime -RandomDelay (New-TimeSpan -Minutes $jitter)
    $triggers += $trigger
}
3
RacingStorm

基本トリガーを作成します。

$t1 = New-ScheduledTaskTrigger -Daily -At 01:00

セカンダリトリガーを作成します。

$t2 = New-ScheduledTaskTrigger -Once -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration (New-TimeSpan -Hours 23 -Minutes 55)

セカンダリから繰り返しオブジェクトを取得し、ベーストリガーに挿入します。

$t1.Repetition = $t2.Repetition

ボブのおじさん:

New-ScheduledTask -Trigger $t1 -Action ...
2
SteinIP

Windows 10で無限のタスク期間を希望する場合は、これを使用します(-RepetitionDurationを指定しないでください)

$action = New-ScheduledTaskAction -Execute (Resolve-Path '.\main.exe')
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1)

Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "GettingDataFromDB" -Description "Dump of new data every hour"
1
Dawid K.

https://stackoverflow.com/a/54674840/9673214 @SteinIPソリューションはわずかな変更で機能しました

「セカンダリトリガーの作成」パーツに、「ベーストリガーの作成」パーツと同じ値を持つ「-At」パラメーターが追加されました。

基本トリガーを作成する

$t1 = New-ScheduledTaskTrigger -Daily -At 01:00

セカンダリトリガーを作成します。

$t2 = New-ScheduledTaskTrigger -Once -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration (New-TimeSpan -Hours 23 -Minutes 55) -At 01:00

魔法をかける:

$t1.Repetition = $t2.Repetition

New-ScheduledTask -Trigger $t1 -Action ...
0
Arun Pant