Следующий сценарий выполняет успешное планирование, но не перезапускает сервер.
schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell -command {Restart-Computer -ComputerName server01 -force -wait
Send-MailMessage -From mail1@domain.com -To mail2@domain.com -Subject 'Rebooted' -SmtpServer smtp.domain.com}"
Журналы событий планировщика заданий показывают, что задача успешно завершена:
Task Scheduler successfully completed task "\restart test" , instance "{4a8b0e75-eb2f-4be6-918d-7b66473dd344}" , action "C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.EXE" with return code 0.
Если я запустил только команды внутри {...}
, он перезапустит сервер и отправит уведомление по электронной почте.
Что мне не хватает?
РЕДАКТИРОВАТЬ: я выполняю это с ноутбука Windows 7 с PowerShell 3.0 на Windows 2012 Server
Выглядит как /tr
неправильно анализирует команду и аргументы, и, похоже, нет надежного способа передать аргументы команде с помощью schtasks.exe. Вместо этого поместите PowerShell -command {...}
в пакетном файле (или, возможно, в файле * .ps1) и вызывать его из задачи, например
schtasks /create ... /tr "RestartAndSendEmail.cmd"
Хорошо, я удаляю свои предыдущие комментарии и перемещаю свои комментарии в ответ, так как сначала мои комментарии начинались как просто общие рекомендации, но они превратились в серьезные разъяснения с точным ответом.
Я тестировал Win7 и PS3, поэтому я использую ту же платформу, что и вы.
Во-первых, просто удалите -Command { ... }
из вашей команды, и под этим я имею в виду следующее:
schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell Restart-Computer -ComputerName server01 -force -wait"
Это работает. Но ваша следующая проблема заключается в том, что вы хотите выполнить несколько команд (1 перезагрузить компьютер и 2 отправить электронное письмо), и для этого я бы рекомендовал поместить команды в файл сценария ps1 и вместо этого выполнить задачу следующим образом:
schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell C:\Scripts\restartAndEmail.ps1"
Я не говорю тебе не мог технически получить две команды Powershell для запуска в одном вызове schtasks, но это громоздко, и вам нужно начать беспокоиться о символах, которые необходимо экранировать в командной строке, таких как |
символ и т. д., и становится проще почти со всех сторон просто использовать вместо него файл ps1.
Важно указать полный путь к сценарию. Текущий рабочий каталог запланированной задачи, вероятно, будет не быть таким же, как путь к скрипту, поэтому относительный путь его не сокращает.
Фактически, когда я делаю запланированные задачи для сценариев Powershell, я обычно также включаю полный путь к Powershell exe, на всякий случай. Те, которые мы уже продемонстрировали здесь, в этом сценарии необязательно включать полный путь к Powershell.exe.