Назад | Перейти на главную страницу

Schtasks - что не так со следующей командой

Следующий сценарий выполняет успешное планирование, но не перезапускает сервер.

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.