Вопрос или проблема
Прежде всего, извините. Это повторный пост моего оригинального вопроса, заданного на “stackoverflow”, но я пытался заставить модераторов переместить его, так как вопрос больше относится к общей проблеме поведения Windows, чем к фактической проблеме программирования, но безуспешно.
Но к делу.
Я пытаюсь запустить BAT-скрипт, когда компьютер (на Win10) получает команду на выключение, выход из системы или перезагрузку. Поскольку я иногда запускаю виртуальные машины (в VirtualBox), мой скрипт предназначен для поиска всех работающих виртуальных машин, их приостановки, а затем проверки, что ни один интерфейс виртуальной машины все еще активен (так как это может привести к повреждению состояния приостановки, требуя свежей перезагрузки виртуальной машины). Скрипт протестирован и функционирует как задумано.
Моя проблема заключается в том, чтобы он запускался автоматически.
Я пытался добавить скрипт в групповую политику в разделе “Конфигурация пользователя | Настройки Windows | Скрипты (вход/выход) | Выход”, как указано в предыдущих постах. Это, казалось, запускало выполнение скрипта, но не позволяло ему правильно завершить выполнение до фактического выключения.
Поэтому я продолжил поиск и в конечном итоге изменил другое значение групповой политики. В разделе “Конфигурация пользователя | Административные шаблоны | Система | Скрипты” я включил “Отображать инструкции в скриптах выхода, пока они выполняются”. Это заставляет Windows показывать командную строку и ждать ее закрытия перед продолжением выключения.
Но я все еще сталкиваюсь с проблемами. Моя текущая проблема заключается в том, что все вышеперечисленное происходит слишком поздно в процессе выключения. Когда я нажимаю кнопку выключения в меню “Пуск”, сначала появляется всплывающее окно, информирующее меня о том, что у меня все еще есть запущенные программы (виртуальные машины), с возможностью принудительной остановки их. Только после этого (принуждая мои виртуальные машины отключаться не самым красивым образом) Windows фактически выполняет мой скрипт (который был предназначен для корректного сохранения виртуальных машин).
Мой вопрос заключается в том, есть ли способ, предпочтительно с использованием групповой политики и/или планировщика задач, заставить Windows выполнить мой BAT-скрипт (и дождаться его завершения) при запуске отключения/выхода/перезагрузки, но до появления запроса “принудительного закрытия”?
С наилучшими пожеланиями, Хенрик В. Нильсен
Необходимость — мать изобретения. Не уверен, применимо ли это в вашем случае с виртуальными машинами, но:
Мой ответ для Windows 10, используя gpedit.msc и настройку скриптов выхода из системы, заключался в создании отдельного файла ping с командой “ping -n 5 127.0.0.1”, который выполнялся после критического. Это позволило моему ‘критическому’ скрипту выхода из системы работать отлично.
Ответ или решение
Запуск пакетного скрипта при завершении работы/выходе/перезагрузке Windows 10
Введение
Ваша задача заключается в автоматизации выполнения пакетного скрипта перед тем, как Windows 10 выполнит команды на завершение работы, выход или перезагрузку. Это позволит вам корректно приостановить работающие виртуальные машины (VM) в VirtualBox, избегая нежелательных последствий и обеспечивая безопасное завершение работы.
Предпосылки
Скрипт уже настроен и корректно работает, однако, появляющаяся при завершении работы система предупреждение о работающих приложениях мешает его выполнению. Вы хотите убрать этот шаг, чтобы Windows дождалась завершения вашего скрипта, прежде чем продолжить процесс отключения.
Решение
Для начала, давайте рассмотрим несколько методов, которые могут помочь вам достичь желаемого результата.
-
GPO (Групповые политики)
- Откройте редактор локальной групповой политики (gpedit.msc).
- Перейдите в раздел
Конфигурация пользователя → Административные шаблоны → Система → Скрипты
. - Убедитесь, что включены параметры, связанные с выполнением логон и логоф скриптов.
- Настройте скрипт так, чтобы он находился в более ранней фазе процесса завершения работы. Вы можете использовать настройки для целей логгирования при завершении работы или управлении с помощью системных событий.
-
Использование Task Scheduler (Планировщик задач)
- Откройте Планировщик задач и создайте новую задачу.
- В настройках триггера выберите "При событии" и установите
Event ID 1074
, что соответствует началу процесса завершения работы системы. - Убедитесь, что задача настроена так, чтобы запускать ваш BAT-сценарий и ожидала его завершения.
- В свойствах задачи активируйте опцию "Запускать с наивысшими привилегиями", чтобы избежать ограничений на выполнение.
-
Использование командной строки в вашем скрипте
- Единственный способ предусмотреть, чтобы ваш скрипт завершил свою работу до вывода предупреждения о работе программ, это контролировать команды Windows.
- Для этого используйте встроенные функции командной строки для проверки состояния виртуальных машин и добавьте задержку, позволяющую завершить операции перед завершением работы Windows:
@echo off REM Ваш код для проверки и приостановки виртуальных машин timeout /t 10
-
Отладка и тестирование
- После внесения изменений не забудьте проверить, запускается ли ваш скрипт при завершении работы системы.
- Тестируйте различные комбинации команд для выявления оптимальной настройки, которая может привести к ожидаемым результатам.
Заключение
Обеспечение успешного выполнения вашего BAT-скрипта до появления предупреждений о закрытии работает как надежный контроль над завершением виртуальных машин. Используя группы политик и Планировщик задач, вы сможете автоматизировать вашу задачу, для чего потребуется лишь немного терпения и тщательной настройки. Ваши виртуальные машины будут защищены, а процесс завершения работы системы — упрощен.
Не забудьте проводить тестирование на резервных данных во избежание потерь или повреждений, и удачи в настройках вашей системы!