Создайте запланированное задание, которое запускается первого числа каждого месяца

Вопрос: Как мне настроить этот сценарий, чтобы можно было запланировать запуск задачи первого числа каждого месяца?

Мой сценарий приведен ниже, и я пытаюсь запланировать ежемесячное задание, которое начинается 1-го числа каждого месяца. Технически мой код работает; он создает задание, которое запускается в определенный день каждые четыре недели. Но я бы предпочел, чтобы оно было запущено в определенную дату, чтобы, когда мы получим оповещения о сбоях на наших серверах, мы знали, что это запланированная задача.

# As of this time, PS v5.1 has no easy way to choose a schedule like "the first of every month."
# Below is the closest I can get to a monthly schedule but it's strictly based on number of weeks.
$ErrorActionPreference = "SilentlyContinue"

$ScheduledTaskActions = @{
    Execute  = "powershell.exe"
    Argument = "Restart-Computer -Force"
}

$TaskAction = New-ScheduledTaskAction @ScheduledTaskActions

$ScheduledTaskParameters = @{
    TaskName = "Restart Computer - Monthly"
    Trigger = New-ScheduledTaskTrigger -At "00:00" -Weekly -WeeksInterval "4" -DaysOfWeek "Monday"
    Action = $TaskAction
    User = "NT Authority\System"
    Runlevel = "Highest"
    Description = "Reboots the machine every four weeks."
}

Register-ScheduledTask @ScheduledTaskParameters

По сути, вышеупомянутый код генерирует триггер, который выглядит в планировщике задач следующим образом, но, опять же, мне нужно что-то, что действительно запускается первого числа каждого месяца.

Это то, что мне нужно:

На мой взгляд, я подумал, что мог бы сделать что-то вроде $trigger = $triggers.Create(4), чтобы сделать это ежемесячным, но даже после просмотра некоторых статей MS, связанных с вышеупомянутыми вопросами, я не знаю, куда поместить этот код на место; похоже, что технически на этих страницах MS нет кода PS.

Я нашел Создать ежемесячный триггер для запланированной задачи в Powershell (с дополнительными критериями) и Powershell для создания запланированной задачи, в которой выполняется ежемесячно, но я до сих пор не до конца понимаю, как у них что-то работает. Я не знаю, то ли у них просто не было полного примера, то ли я просто не могу понять, как они это заработали.

Обновленный скрипт

Благодаря помощи MisterSmith я использую это сейчас. По моему тестированию, кажется, работает нормально! Я изменил переменную даты $Date.Day -le "27" и переменную дня на $Date.DayOfWeek -eq "Wednesday", а затем вручную запустил задачу после создания. Машина подпрыгнула, как и ожидалось. Затем я отменил эти изменения и воссоздал задачу так, чтобы она запускалась в первый понедельник каждого месяца. С точки зрения машины, задача загадочна, но она порождена нашим RMM, поэтому я не беспокоюсь о том, как она выглядит — пока мои товарищи по команде могут читать и понимать код.

$ErrorActionPreference = "SilentlyContinue"
# Command that does the work.
$Command = {
    $Date = Get-Date
    if (($Date.Day -le "7") -and ($Date.DayOfWeek -eq "Monday")){
        Restart-Computer -Force
    }
}

# Convert the command block above to a Base64-encoded command so it can be easily added to a scheduled task.
$Base64Command = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($Command))

## Creating the Scheduled Task.
# Hash table for task's command and arguments; in this case, the argument is the Base64-encoded command from above.
$ScheduledTaskActions = @{
    Execute = "powershell.exe"
    Argument = "-EncodedCommand $Base64Command"
}

# Variable for the task's action.
$TaskAction = New-ScheduledTaskAction @ScheduledTaskActions

# Hash table for parameters used by Register-ScheduledTask.
$ScheduledTaskParameters = @{
    TaskName = "Restart Computer - First Monday of Every Month"
    Trigger = New-ScheduledTaskTrigger -At "00:30" -Weekly -DaysOfWeek "Monday"
    Action = $TaskAction
    User = "NT Authority\System"
    Runlevel = "Highest"
    Description = "Reboots the machine on the first Monday of every month."
}

# Registering the new task with all the settings above.
Register-ScheduledTask @ScheduledTaskParameters -Force

Как это выглядит в планировщике задач Windows: Триггеры:

Детали триггера:

Действия:

🤔 А знаете ли вы, что...
PowerShell обеспечивает интеграцию с системами управления версиями, такими как Git.


56
1

Ответ:

Решено

Простой метод PowerShell — выполнять сценарий каждый понедельник в планировщике задач, затем в PowerShell решать, является ли это 1-м понедельником месяца или нет, и перезапускать при необходимости.

Обновите свое действие, чтобы вызвать файл вместо Restart-Computer напрямую.

$ScheduledTaskActions = @{
  Execute  = "powershell.exe"
  Argument = '-File C:\path\to\your\restart-script.ps1'
}

Создайте restart-script.ps1 где-нибудь, используя приведенное ниже. Его следует выключить только в том случае, если сегодня понедельник и в течение первых 7 дней месяца, в противном случае он ничего не делает:

$d = Get-Date;
if (($d.Day -le 7) -and ($d.DayOfWeek -eq 'Monday')){
  Restart-Computer -Force
}

Наконец, запускайте скрипт каждый понедельник:

$Trigger = New-ScheduledTaskTrigger -At "00:00" -Weekly -DaysOfWeek "Monday"

Если вы действительно не хотите иметь дело с управлением restart-script.ps1 / действительно хотите, чтобы все это содержалось в сценарии диспетчера задач, вы можете преобразовать приведенный выше сценарий в байты Юникода, обернуть его строкой base64 и передать его в powershell с помощью powershell -EncodedCommand [BASE64_STRING_ENCODED_UNICODE_BYTES]. (выглядит некрасиво/подозрительно, но более сдержанно)


Интересные вопросы для изучения

Как сохранить новые строки из вывода команды, распечатанные с помощью Write-Host в Powershell?Powershell – время последнего выполнения скриптаPowershell Get-ADGroupMember и Get-ADUserКак захватить стандартный вывод ProcessStartInfo в виде строки для сравнения с помощью Powershell?Powershell быстро получает список из больших каталоговЗапланируйте задачу на второе воскресенье месяца или на третье и четвертое воскресенье и субботуИспользуя Postgres/Flask, как я могу запросить следующее появление запланированной задачи, когда дни/часы/минуты хранятся как целые числа в своих собственных столбцах?Автоматическое завершение обработки заказов WooCommerce с бронированиями, дата начала которых уже прошлаКак обеспечить выполнение хрон-задания точно на каждой возможной 5-минутной отметке (0:00, 0:05, 0:10) независимо от времени начала хрон-задания?Запланированное задание Synology не выполняет простую команду с сообщением «нет такого файла»