Powershell: 일별 트리거 및 반복 간격이 있는 스케줄링된 작업
매일 트리거되고 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를 통해 쉽게 적용할 수 있습니다.저는 그것이 아마도 단순하다고 느끼지만 놓치고 있습니다.
어떤 도움이든 감사합니다.
편집: 중복 질문을 처리합니다."Powershell v3 New-Job Trigger with Repeating" 게시물의 질문도 마찬가지입니다.하지만 제가 앞서 언급했듯이, 어떤 답변도 문제를 해결하지 못했습니다.표시된 답변은 제가 이미 가지고 있는 것과 정확히 일치합니다. -Once 트리거로 작업을 설정한 다음 5분마다 1일 동안 반복되도록 업데이트합니다.첫 번째 날 이후에는 해당 작업이 다시 트리거되지 않습니다.작업을 매일 반복하고 다음 트리거까지 지속하는 문제는 다루지 않습니다.
그 게시물의 다른 세 개의 답변도 질문을 다루지 않고 있습니다.정답이 아니기 때문에 답변으로 표시된 이유를 모르겠습니다.저는 이 질문을 올리기 전에 그 답변들을 충분히 검토했습니다.그 게시물이 오래되고 답변으로 표시되면서 저는 이 질문을 만들었습니다.
참고: 해결 방법을 찾았지만 좋은 방법은 아닙니다.현재 파워셸을 사용하여 사용자 지정 트리거를 정의하는 가장 쉬운 방법은 스케줄링된 작업 XML을 조작하고 다음을 사용하여 직접 가져오는 것 같습니다.Register-ScheduledTask
PowerShell 인터페이스를 됩니다.RepetitionDuration[System.TimeSpan]::MaxValue결과적으로 "무한히" 지속됩니다.
$trigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 5) `
-RepetitionDuration ([System.TimeSpan]::MaxValue)
윈도우즈 서버 2012 R2(PowerShell 4.0)에서 테스트됨
기본 트리거 생성:
$t1 = New-ScheduledTaskTrigger -Daily -At 01:00
트리거 (" " " " (으)" 생략)-RepetitionDuration 것을 .-At인수):
$t2 = New-ScheduledTaskTrigger -Once -At 01:00 `
-RepetitionInterval (New-TimeSpan -Minutes 15) `
-RepetitionDuration (New-TimeSpan -Hours 23 -Minutes 55)
보조에서 반복 개체를 가져와 기본 트리거에 삽입합니다.
$t1.Repetition = $t2.Repetition
밥은 당신의 삼촌입니다.
New-ScheduledTask -Trigger $t1 -Action ...
다음은 매일 오전 12시에 시작하여 나머지 시간 동안 매 시간마다 반복되는 예약된 작업을 Powershell에서 생성하는 방법입니다(내 시스템의 경우 YMMV).따라서 무기한으로 실행됩니다.이것이 설정에 비해 우수한 접근 방식이라고 생각합니다.-RepetitionDuration([timespan]::MaxValue)트리거가 작업 스케줄러에 다음과 같이 표시됩니다.
매일 오전 12시 - 트리거된 후 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.
더 좋은 방법이 있을 거라고 확신하지만, 이것이 제 현재 해결책입니다.
원하는 트리거를 사용하여 작업을 생성한 다음 생성된 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
이 작업을 수행하는 가장 쉬운 방법은 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일 동안 반복되는 작업이 만들어집니다.
https://stackoverflow.com/a/54674840/9673214 @SteinIP 솔루션은 약간의 수정을 거쳐 작동했습니다.
'create secondary trigger' 부품에 'create base trigger' 부품과 동일한 값의 '-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 ...
또 다른 방법은 다음과 같은 여러 트리거를 만드는 것입니다.
$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
}
Windows 10에서 작업 기간을 제한하려면 이를 사용하십시오(지정하지 않음 -반복 기간).
$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"
여기 이 오래된 밤나무에 효과가 있는 것처럼 보이지만 다른 솔루션보다 덜 복잡한 또 다른 변형이 있습니다.서버 2012 R2, 서버 2016 및 서버 2019에서 각 OS의 기본 PS 버전으로 테스트되었습니다. 2012년에는 트리거를 "합병"하지 못했습니다.다른 사람들은 신경쓰지 않았습니다.
단계는 간단합니다.
- 스케줄링된 작업을 기본 스케줄로 먼저 생성
- 새 태스크에서 세부 정보 추출
- 트리거 반복/기간 수정
- 수정된 버전으로 기존 작업 업데이트
예제는 하루 동안 매 시간 반복되는 일일 작업으로 구성되어 있습니다(날짜/시간 구문을 조금 더 명확하게 하기 위해 23시간으로 설정했습니다).기간 및 간격에 동일한 시간 범위 형식이 사용됩니다.
# create the basic task trigger and scheduled task
$trigger = New-ScheduledTaskTrigger -Daily -At 15:55
$Settings = New-ScheduledTaskSettingsSet –StartWhenAvailable
Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -Action $Action -Setting $Settings -User $User
# Get the registered task parameters
$task = Get-Scheduledtask $TaskName
# Update the trigger parameters to the repetition intervals
$task.Triggers[0].Repetition.Duration = "P0DT23H0M0S"
$task.Triggers[0].Repetition.Interval = "P0DT1H0M0S"
# Commit the changes to the existing task
Set-ScheduledTask $task
작업에 여러 개의 트리거가 있는 경우(반복 간격이 있는 경우는 드물지만) 반복이 필요한 트리거를 수정해야 합니다.예제에는 트리거가 하나만 있으므로 트리거 목록의 첫 번째 멤버(그리고 유일한 멤버)만 선택합니다.$task.Triggers[0]
타임스팬은 ISO 8601 형식이며 공백이 없는 문자열입니다.필요한 숫자 값은 시간 지정보다 앞에 있습니다(예:1H한 시간 동안은 안 됩니다.H1문자열은 나열된 모든 시간 지정을 포함해야 합니다.0빈 값을 대체합니다.P시작 부분의 ("기간")은 타임스탬프가 아닌 기간임을 나타냅니다.
P(주기)0D(일)T(시간)0H(우리)0M(분)0S(초)
P0DT1H0M0S = 0 days, 1 hours, 0 minutes, 0 seconds
P0DT0H15M30S = 0 days, 0 hours, 15 minutes, 30 seconds
태스크의 시작 시간을 변경하려는 경우 유사한 방법을 사용하여 트리거를 수정할 수 있습니다.이는 에 적용됩니다.-Once또는-Daily임무들.
$task = Get-ScheduledTask $taskname
$d = ([DateTime]::now).tostring("s") # 2021-11-30T17:39:31
$task.Triggers[0].StartBoundary = $d
Set-ScheduledTask $task
오래된 질문이고 파워셸 cmdlet이 필요한지 잘 모르겠습니다.하지만 저는 그냥 sch tasks를 사용합니다.
15분마다 실행하려는 경우:
schtasks /f /create /tn taskname `
/tr "powershell c:\job.ps1" /ru system `
/sc minute /mo 15 /sd 01/01/2001 /st 00:00
이것은 2001년 1월 1일 자정에 '트리거'되고 15분마다 실행됩니다.오늘 생성하면 다음 이벤트 간격으로 실행됩니다.
매일 '트리거'하도록 하려면 다음을 수행할 수 있습니다.
schtasks /f /create /tn taskname `
/tr "powershell c:\job.ps1" /ru system `
/sc daily /sd 01/01/2001 /st 10:00 /du 12:14 /ri 15
이는 2001년 1월 1일 오전 10시에 '트리거'되며, 15분마다 12시간 14분 동안 실행됩니다.오늘 시작하면 다음 이벤트 간격으로 실행됩니다.
저는 보통 위와 같은 '15분마다'를 실행하고 아래와 같은 'x회 매일'을 실행합니다.그래서 제가 오전 10시와 오후 2시에 무언가를 실행해야 한다면, 두 번째 것의 /du를 5시간으로, /ri를 4시간으로 변경하면 됩니다. 그러면 그것은 4시간마다 반복되지만 5시간 동안만 반복됩니다.기술적으로는 4시 1분에 끝날 수도 있지만, 저는 일반적으로 한 시간 동안 안전합니다.
저는 task.xml 메서드를 사용하곤 했고 두 번째 시나리오에서 정말 힘든 시간을 보내고 있었습니다. task.xml에서 내보냈는데 기본적으로 아래와 같은 내용이 있습니다.
<Triggers>
<CalendarTrigger>
<Repetition>
<Interval>PT3H</Interval>
<Duration>PT15H</Duration>
<StopAtDurationEnd>false</StopAtDurationEnd>
</Repetition>
<StartBoundary>2017-11-27T05:45:00</StartBoundary>
<ExecutionTimeLimit>PT10M</ExecutionTimeLimit>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
이 작업은 5시 45분에서 7시 45분 사이에 3시간마다 실행되는 작업에 대한 것입니다.그래서 나는 단지 간격과 기간을 일별 스케줄 명령어에 입력했고 그것은 잘 작동했습니다.저는 표준화를 위해 오래된 날짜를 사용합니다.오늘부터 언제든지 시작할 수 있을 것이고 그러면 똑같이 작동할 것입니다.
원격 서버에서 이 작업을 실행하려면 다음과 같은 방법을 사용합니다.
$sb = { param($p); schtasks /f /create /tn `"$p`" /tr `"powershell c:\jobs\$p\job.ps1`" /ru system /sc daily /sd 01/01/2001 /st 06:00 /du 10:00 /ri (8*60) } }
Invoke-Command -ComputerName "server1" -ScriptBlock $sb -ArgumentList "job1"
Windows 10에서 작업
Set-ExecutionPolicy RemoteSigned
$action=New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument 'C:\Users\hp\Anaconda3\python.exe C:\Users\hp\Desktop\py.py'
$trigger = New-ScheduledTaskTrigger `
-Once `
-At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 15) `
-RepetitionDuration (New-TimeSpan -Days (365 * 20))
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "ts2" -Description "tsspeech2"
언급URL : https://stackoverflow.com/questions/20108886/powershell-scheduled-task-with-daily-trigger-and-repetition-interval
'programing' 카테고리의 다른 글
| Android용 텍스트 보기 자동 맞춤 (0) | 2023.08.12 |
|---|---|
| 오라클 데이터베이스에서 날짜 형식 ddmmyyyy를 선택합니다. (0) | 2023.08.12 |
| PowerShell에서 복사할 파일 목록을 가져옵니다. (0) | 2023.08.12 |
| Pycharm/Python OpenCV 및 CV2 설치 오류 (0) | 2023.08.12 |
| 판다 사용 두 개의 서로 다른 Excel 파일/시트 결합/합병 (0) | 2023.08.12 |