在 Powershell 中为计划任务创建每月触发器(有附加条件)
Create monthly trigger for Scheduled Task in Powershell (With additional criteria)
我目前正在编写一个脚本,当 运行 时,它会创建一些计划任务,让主机做几件事,然后在指定的时间跨度内重新启动。
此脚本需要在多个域控制器上 运行,因此我想 "load balance" 通过使用类似 New-ScheduledTaskTrigger -RandomDelay 的东西,以便它们不会一次重新启动,而是一种传播出来了。
目标是能够更改一些关于何时重启的变量,例如:
- 18:00 和 23:59 之间的每个月的第一个星期一
- 01:00 和 06:00 之间的每个星期四
- 在 04:00 和 ..... 之间的每一天,你都知道我要去哪里
但是在 New-ScheduledTaskTrigger
中没有“-Monthly”这样的东西
这是第一个问题,我可能可以在其他帖子的帮助下解决这个问题,但是如果我这样做,例如 我无法使用我认为是的 -RandomDelay这是一个主要功能。
这是我想象的如果 -Monthly 确实有效(对于每月触发)应该看起来的样子:
$rebootFrequency = MONTHLY # DAILY, WEEKLY, MONTHLY
$rebootWeek = FIRST # FIRST, SECOND, THIRD, FOURTH, LAST
$rebootDayOfWeek = MON # MON, TUE, WED, THU, FRI, SAT, SUN
$rebootTimeFrom = 10:00 # HH:MM[:SS]
$rebootTimeTo = 16:00 # HH:MM[:SS]
New-ScheduledTaskTrigger -"$rebootFrequency" -WeekOfMonth $rebootWeek;
-DayOfWeek $rebootDayOfWeek -At $rebootTimeFrom -RandomDelay $rebootTimeTo
你对我应该如何解决这个问题有什么建议吗?
我可以用 schtask.exe 做同样的事情,但是我最终不得不制作某种脚本来执行 "RandomDelay" 功能。
如有任何问题,欢迎随时提问。
提前致谢。
挑战 1
我现在已经可以使用了,但我正在尝试使脚本更直观一些,但我不知道该怎么做...
我想做的是 "convert" 从使用天数(例如:星期四为 16)到能够写 "THU"。
现在看起来像这样:
$rebootDaysOfWeek = "16" # SUN=1, MON=2, TUE=4, WED=8, THU=16 etc.
$trigger.DaysOfWeek = $rebootDaysOfWeek
但如果是这样的话我会觉得它更酷:
$rebootDaysOfWeek = "THU" # SUN, MON, TUE, WED, THU, FRI, SAT
$trigger.DaysOfWeek = $rebootDaysOfWeek
但我似乎找不到 "convert" $rebootDaysOfWeek 来使用位掩码的方法。
查看 Microsoft 文档:
https://docs.microsoft.com/en-us/windows/win32/taskschd/time-trigger-example--scripting-
示例在 VB 中,但看起来它只是一个 ComObject。我没有足够的时间玩,但你可以这样开始:
$service = new-object -comobject Schedule.Service
$service.connect()
$taskdefinitiion = $service.NewTask(0)
有很多任务定义的东西,但它归结为触发器,你会这样做:
$triggers = $taskDefinition.Triggers
$trigger = triggers.Create(5) # I had to try different numbers here, didn't dig through the docs
$trigger.DaysOfWeek = 16 #Thursday
$trigger.WeeksOfMonth = 1 # First week, 2 for second, 6 for third, 8 for forth
$trigger.MonthsOfYear = 4095 # all months
$trigger.RandomDelay = 'PT1H' # 1 hour random delay.
我让你从这里拿走。链接到上面的一些项目:
https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-daysofweek
https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-monthsofyear
https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-weeksofmonth
https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-randomdelay
挑战 1 更新
为了使用 "friendly" 对按位十进制值的引用,您可以创建常量部分或使用哈希表,无论哪种方式,您都必须自己进行转换:
# Constants
$SUN = 1
$MON = 2
$TUE = 4
$WED = 8
$THU = 16
$FRI = 32
$SAT = 64
# Hashtable - because why not!
$DaysOfWeek = @{
SUN = 1
MON = 2
TUE = 4
WED = 8
THU = 16
FRI = 32
SAT = 64
}
然后你可以使用:
$trigger.DaysOfWeek = $THU
要么
$trigger.DaysOfWeek = $DaysOfWeek["THU"]
我目前正在编写一个脚本,当 运行 时,它会创建一些计划任务,让主机做几件事,然后在指定的时间跨度内重新启动。 此脚本需要在多个域控制器上 运行,因此我想 "load balance" 通过使用类似 New-ScheduledTaskTrigger -RandomDelay 的东西,以便它们不会一次重新启动,而是一种传播出来了。
目标是能够更改一些关于何时重启的变量,例如:
- 18:00 和 23:59 之间的每个月的第一个星期一
- 01:00 和 06:00 之间的每个星期四
- 在 04:00 和 ..... 之间的每一天,你都知道我要去哪里
但是在 New-ScheduledTaskTrigger
中没有“-Monthly”这样的东西这是第一个问题,我可能可以在其他帖子的帮助下解决这个问题,但是如果我这样做,例如
这是我想象的如果 -Monthly 确实有效(对于每月触发)应该看起来的样子:
$rebootFrequency = MONTHLY # DAILY, WEEKLY, MONTHLY
$rebootWeek = FIRST # FIRST, SECOND, THIRD, FOURTH, LAST
$rebootDayOfWeek = MON # MON, TUE, WED, THU, FRI, SAT, SUN
$rebootTimeFrom = 10:00 # HH:MM[:SS]
$rebootTimeTo = 16:00 # HH:MM[:SS]
New-ScheduledTaskTrigger -"$rebootFrequency" -WeekOfMonth $rebootWeek;
-DayOfWeek $rebootDayOfWeek -At $rebootTimeFrom -RandomDelay $rebootTimeTo
你对我应该如何解决这个问题有什么建议吗?
我可以用 schtask.exe 做同样的事情,但是我最终不得不制作某种脚本来执行 "RandomDelay" 功能。
如有任何问题,欢迎随时提问。 提前致谢。
挑战 1
我现在已经可以使用了,但我正在尝试使脚本更直观一些,但我不知道该怎么做...
我想做的是 "convert" 从使用天数(例如:星期四为 16)到能够写 "THU"。
现在看起来像这样:
$rebootDaysOfWeek = "16" # SUN=1, MON=2, TUE=4, WED=8, THU=16 etc.
$trigger.DaysOfWeek = $rebootDaysOfWeek
但如果是这样的话我会觉得它更酷:
$rebootDaysOfWeek = "THU" # SUN, MON, TUE, WED, THU, FRI, SAT
$trigger.DaysOfWeek = $rebootDaysOfWeek
但我似乎找不到 "convert" $rebootDaysOfWeek 来使用位掩码的方法。
查看 Microsoft 文档: https://docs.microsoft.com/en-us/windows/win32/taskschd/time-trigger-example--scripting-
示例在 VB 中,但看起来它只是一个 ComObject。我没有足够的时间玩,但你可以这样开始:
$service = new-object -comobject Schedule.Service
$service.connect()
$taskdefinitiion = $service.NewTask(0)
有很多任务定义的东西,但它归结为触发器,你会这样做:
$triggers = $taskDefinition.Triggers
$trigger = triggers.Create(5) # I had to try different numbers here, didn't dig through the docs
$trigger.DaysOfWeek = 16 #Thursday
$trigger.WeeksOfMonth = 1 # First week, 2 for second, 6 for third, 8 for forth
$trigger.MonthsOfYear = 4095 # all months
$trigger.RandomDelay = 'PT1H' # 1 hour random delay.
我让你从这里拿走。链接到上面的一些项目: https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-daysofweek https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-monthsofyear https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-weeksofmonth https://docs.microsoft.com/en-us/windows/win32/taskschd/monthlydowtrigger-randomdelay
挑战 1 更新
为了使用 "friendly" 对按位十进制值的引用,您可以创建常量部分或使用哈希表,无论哪种方式,您都必须自己进行转换:
# Constants
$SUN = 1
$MON = 2
$TUE = 4
$WED = 8
$THU = 16
$FRI = 32
$SAT = 64
# Hashtable - because why not!
$DaysOfWeek = @{
SUN = 1
MON = 2
TUE = 4
WED = 8
THU = 16
FRI = 32
SAT = 64
}
然后你可以使用:
$trigger.DaysOfWeek = $THU
要么
$trigger.DaysOfWeek = $DaysOfWeek["THU"]