繁体   English   中英

为 Powershell 中的计划任务创建每月触发器(带有附加条件)

[英]Create monthly trigger for Scheduled Task in Powershell (With additional criteria)

我目前正在编写一个脚本,该脚本在运行时会创建一些计划任务,使主机做几件事,然后在指定的时间范围内重新启动。 该脚本需要在多个域控制器上运行,因此我想通过使用类似 New-ScheduledTaskTrigger -RandomDelay 的东西来“负载平衡”,以便它们不会一次重新启动,而是将其分散开来。

目标是能够更改何时重新启动的一些变量,例如:

  1. 每月第一个星期一 18:00 至 23:59
  2. 每个星期四 01:00 和 06:00 之间
  3. 每天 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”function。

如果您有任何问题,请随时进一步询问。 提前致谢。

挑战一

我现在已经让它工作了,但我试图让脚本更直观一点,但我不知道我会怎么做......

我想要做的是将使用天数(例如:星期四 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

但我似乎找不到“转换” $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/windowstrigger-randomdelay3

挑战 1 更新

为了使用对位十进制值的“友好”引用,您可以创建一个常量部分或使用哈希表,无论哪种方式您都必须自己进行转换:

# 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"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM