简体   繁体   中英

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

I'm currently working on a script that when run, creates some Scheduled tasks that makes the host machine do several things and then restart within a specified time span. This script needs to be run on multiple domain controllers, and therefor i would like to "load balance" by using something like New-ScheduledTaskTrigger -RandomDelay in order for them to not reboot all at once, but kind of spread it out.

The goal is to be able to change some variables of when to restart, things like:

  1. First Monday of the month between 18:00 and 23:59
  2. Every Thursday between 01:00 and 06:00
  3. Every day between 04:00 and..... you see where I'm going

However there is no such thing as a "-Monthly" in New-ScheduledTaskTrigger

That's the first problem, this one i can probably solve with the help from other posts, but if i do it for example like this I'm not able to use the -RandomDelay which I think is a major feature for this to work.

Here is how I imagine it should look if the -Monthly did work (for a monthly trigger):

$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

Do you have any suggestions as to how I should solve this problem?

I could do the same thing with schtask.exe, however I would end up having to make some kind of script to do the "RandomDelay" function.

Feel free to ask further if you have any questions. Thanks in advance.

Challenge 1

I've now got it to work, but I'm trying to make the script a bit more intuitive, but I can't figure out how i would do it...

What i want to do is to "convert" from using the numbers in days (for example: 16 for Thursday) to being able to write "THU" instead.

Right now it looks something like this:

$rebootDaysOfWeek = "16" # SUN=1, MON=2, TUE=4, WED=8, THU=16 etc.
$trigger.DaysOfWeek = $rebootDaysOfWeek

But I would find it alot cooler if it was something like this:

$rebootDaysOfWeek = "THU" # SUN, MON, TUE, WED, THU, FRI, SAT
$trigger.DaysOfWeek = $rebootDaysOfWeek

But I can't seem to find a way to "convert" $rebootDaysOfWeek to work with the bit mask.

Check out the Microsoft Docs: https://docs.microsoft.com/en-us/windows/win32/taskschd/time-trigger-example--scripting-

The sample is in VB, but it looks like it's just a ComObject. I haven't had enough time to play around, but you can start like this:

$service = new-object -comobject Schedule.Service
$service.connect()
$taskdefinitiion = $service.NewTask(0)

There's lots of task definition stuff, but it get's down to the triggers and you'll do this:

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

I'll let you take it from here. Links to some of the items above: 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

UPDATE FOR CHALLENGE 1

In order to use "friendly" references to the bitwise decimal value you can either create a constants section or use hashtable, either way you are going to have to do the conversion yourself:

# 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
}

Then you can use: $trigger.DaysOfWeek = $THU or $trigger.DaysOfWeek = $DaysOfWeek["THU"]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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