Вопрос: Как мне настроить этот сценарий, чтобы можно было запланировать запуск задачи первого числа каждого месяца?
Мой сценарий приведен ниже, и я пытаюсь запланировать ежемесячное задание, которое начинается 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: Триггеры:
Детали триггера:
Действия:
После вашего редактирования до сих пор не понятно, почему вы не можете использовать: i.sstatic.net/Wx1xE2gw.png
Вы не можете с помощью командлета. Я думаю, вы можете преобразовать код С# в PS. Будем работать над решением.
Найден исходный код: github.com/microsoftarchive/msdn-code-gallery-microsoft/blob/…
Простой метод 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]
. (выглядит некрасиво/подозрительно, но более сдержанно)
Это могло бы сработать, но, как вы сказали, мне нужно будет поддерживать сценарий. Если мне нужно поддерживать задачу и другой файл, я мог бы просто создать задачу, экспортировать XML и соответствующим образом развернуть его с помощью PS. Итак, это вариант. Однако мне интересно ваше решение Base64. Я предполагаю, что вы поместите содержимое сценария в блок сценария, а затем закодируете его?
Думаю, у меня работает опция Base64. Я добавлю соответствующий сценарий и скриншоты вверху, если все будет работать так, как ожидалось.