Создание ежемесячного триггера для запланированной задачи в Powershell (с дополнительными критериями) - PullRequest
0 голосов
/ 18 октября 2019

В настоящее время я работаю над сценарием, который при запуске создает некоторые запланированные задачи, которые заставляют хост-компьютер делать несколько вещей, а затем перезапускаются в течение указанного промежутка времени. Этот сценарий должен быть запущен на нескольких контроллерах домена, и поэтому я хотел бы «сбалансировать нагрузку», используя что-то вроде New-ScheduledTaskTrigger -RandomDelay, чтобы они не перезагружались все сразу, а как бы распространяли его.

Цель состоит в том, чтобы иметь возможность изменять некоторые переменные времени, когда необходимо перезапустить, например:

  1. Первый понедельник месяца с 18:00 до 23: 59
  2. Каждый четверг с 01:00 до 06:00
  3. Каждый день с 04:00 до ..... вы видите, куда я иду

Однако такого не бываеткак «-Monthly» в New-ScheduledTaskTrigger

Это первая проблема, эту, которую я, вероятно, могу решить с помощью других постов, но если я сделаю это, например, this IЯ не могу использовать -RandomDelay, который, как мне кажется, является основной функцией для этой работы.

Вот как я должен выглядеть, если -Monlyly работал (для ежемесячного триггера):

$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

Теперь я заставил его работать, но я пытаюсь сделать сценарий немного более интуитивным, но я не могу понять, как ябудет делать это ...

Что я хочу сделать, это "конвертировать" из использования чисел в днях (например: 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 для работы с битовой маской.

1 Ответ

0 голосов
/ 18 октября 2019

Ознакомьтесь с документами 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

Для использования "«дружественные» ссылки на побитовое десятичное значение, вы можете создать секцию констант или использовать хеш-таблицу, в любом случае вам придется выполнить преобразование самостоятельно:

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

...