У меня есть одна старая программа, которая иногда плохо переносит выход из гибернации. Ее значок спрятан в области уведомлений, и в самый нужный момент выяснялось, что программа закрылась. Приходилось запускать ее вручную, что раздражало, конечно.
Вы, наверное, ожидаете рассказа о том, как я ловко выявил причину такого поведения программы? А я не стал разбираться, тем более что проблема проявлялась лишь время от времени. Вместо этого я использовал планировщик заданий для запуска программы при выходе из сна.
Написать эту статью меня побудили сразу два вопроса на эту тему, которые возникли в один день в разных форумах конференции OSZone.net. Любопытно, что участники использовали разные операционные системы – Windows XP и Windows 7. Однако первый из них не сможет воспользоваться моим решением, потому что возможность запускать задачу при занесении в журнал определенного события появилась в Windows, начиная с Vista.
Выполнение задачи по событию
В планировщике заданий Windows предусмотрено выполнение задач при запуске компьютера и входе пользователя в систему. Однако там отсутствует возможность запуска задачи при выходе из спящего режима или гибернации. Тем не менее, проблема решается благодаря тому, что:
- в качестве триггера для выполнения задачи в планировщике можно указать событие из журнала (eventvwr.msc)
- при выходе из сна или гибернации в журнал заносится событие
Источник и номер события зависят от ОС:
- Windows 10: событие с кодом 1 от источника Power-Troubleshooter пишется в журнал Система
- Windows 7 и 8.1: событие с кодом 300 пишется в журнал Microsoft-Windows-Diagnostics-Performance (о нем я рассказывал на примере события 100)
Знания этих фактов достаточно, чтобы приступить к созданию задачи.
Создание задачи в планировщике
В планировщике есть мастер создания простой задачи, который проведет вас по всем шагам.
- Откройте Пуск – Поиск – Планировщик заданий.
- В правой панели планировщика щелкните Создать простую задачу.
- Задайте имя задачи и нажмите Далее.
- На странице Триггер задачи выберите При занесении в журнал указанного события и нажмите Далее.
- На открывшейся странице укажите параметры события:
Параметр Windows 10 Windows 8.1 и Windows 7 Журнал System (Система) Microsoft-Windows-Diagnostics-Performance Источник Power-Troubleshooter Diagnostics-Performance Код события 1 300 - На следующих шагах сначала выберите Запустить программу, затем укажите к ней путь и параметры командной строки, если необходимо. Я использовал скрипт, о котором чуть ниже.
Если у вас ноутбук, по умолчанию задача настроена будет выполняться, только если он подключен к источнику питания. Дважды щелкните задачу в списке, чтобы открыть ее свойства, и на вкладке Условия снимите это ограничение.
Теперь при выходе из спящего режима или гибернации будет запускаться указанная программа. Для ваших целей этого может быть достаточно, но не исключаю, что вам пригодится приведенный ниже скрипт.
Примеры скриптов
Проверка наличия и перезапуск запущенного процесса (CMD)
Как я сказал выше, проблема с моей программой возникала лишь время от времени. Поэтому я не хотел «убивать» процесс без необходимости, равно как и запускать второй экземпляр программы. Поэтому на шаге 6 я указал путь не к программе, а к скрипту.
Скрипт проверяет наличие процесса, и если он отсутствует, запускает программу.
CMD
@Echo Off SetLocal EnableExtensions Set ProcessName=program.exe TaskList /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%" If %ErrorLevel% NEQ 0 Start /d "C:\Program Files\Program" program.exe
PowerShell
#Get-Process покажет имя процесса $ProcessName = "myprogram" #Пытаемся аккуратно завершить процесс $process = Get-Process $ProcessName -ErrorAction SilentlyContinue if ($process) { $process.CloseMainWindow() Start-Sleep -Milliseconds 100 #Если процесс не завершился, убиваем его if (!$process.HasExited) { $process | Stop-Process -Force } } #Запускаем программу (если она не в PATH, укажите полный путь к EXE) Start-Process $ProcessName
Чтобы адаптировать скрипт для своих нужд, в выделенных строках укажите:
- имя процесса
- путь к папке с программой и имя исполняемого файла
Как видите, используя возможности планировщика заданий и журнала событий Windows 7+, задачу можно решить очень просто и быстро. Варианты решения этой задачи для Windows XP обозначены в этом сообщении форума, но без плясок с бубном там не обойтись.
Перезапуск устройств
Нередко при выходе из сна/гибернации проблемы возникают с устройствами, например, с сетевыми адаптерами. Если они решаются перезапуском устройства в диспетчере, это можно автоматизировать.
- CMD. Утилита devcon (консольный диспетчер устройств) работает в Windows 7 и новее.
- PowerShell. Модуль PNPDevice работает в Windows 10: примеры управления устройствами в канале и блоге.
В основном, я задействую планировщик заданий для распределения автозагрузки по времени и запуска программ с полными правами без запроса UAC. А вы используете планировщик? Какие задачи и на каких условиях вы настроили для выполнения?
Павел
Всем добрый день!
Настроил планировщик заданий на сервере таким образом, чтобы при событии входа пользователя в систему запускалась некая программа. Вопрос в том, можно ли передать в программу в качестве аргумента командной строки имя вошедшего пользователя из события (TargetUserName)?
Игорь
Здравствуйте хотелось бы узнать возможно ли отключать питания USB порта что бы каждый раз не вынимать модем из USB пора
Михаил Критский
Благодарю, выручил. Толковое описание!
Moscvich
Вы почитайте статью Вадима о разных дефрагментаторах ,подумайте ,а потом решайте сами чем пользоваться.
https://www.outsidethebox.ms/12966/
Я тоже было время ,когда использовал для дефрагментации программу AusLogics BoostSpeed ,а сейчас много лет использую по расписанию приложение самой операционной системы .И очень доволен её работой !