Запустить командный файл при завершении работы Windows 7 перед закрытием программ (желательно при нажатии кнопки питания)

У меня есть Windows 7 с несколькими машинами VMWare Player, которые запускаются при загрузке. Я использую WMWare VIX и командный файл для выключения виртуальных машин, например:

"C:\path\to\VMWare VIX\vmrun.exe" -T player stop "C:\path\to\machine.vmx" soft

Я хочу выполнить эти команды при выключении хост-машины, чтобы мне не нужно было выключать каждую виртуальную машину отдельно . При развертывании выключение, скорее всего, начнется с короткого нажатия кнопки питания ACPI, а не из меню «Пуск». Способы, которые я пробовал, не работают (по крайней мере, недостаточно хорошо):

  1. Групповые политики - наиболее очевидный способ, но в Windows 7 нет возможности запускать сценарии выключения «асинхронно».
    В результате Windows сначала сообщает всем открытым окнам о закрытии, виртуальные машины отвечают, что они используются, и вы получаете диалоговое окно «Принудительное закрытие». Только после VMWare Player и все остальное закрыто, скрипты запускаются, бесполезно.
    Вы могли подумать, что это можно изменить, но я помню, что видел официальную заметку MS типа «нет, извините». Не могу найти ссылку.

  2. Используйте один командный файл, который закрывает все виртуальные машины, а затем выключает хост в качестве ярлыка на рабочем столе вместо обычной кнопки выключения. - Работает, и именно это я использую сейчас при разработке.
    Но использование кнопки питания ACPI инициирует нормальное завершение работы с тем же результатом, что и раньше, и было бы лучше, если бы конечному пользователю, который ежедневно включает и выключает машину, не нужно было бы использовать монитор и мышь.
    На данный момент я ищу в Google способ изменить действие, вызываемое при нажатии кнопки физического питания. Windows позволяет вам выбирать между некоторыми различными действиями, такими как Sleep, Hibernate, Restart и т. Д., Но не могли бы вы изменить это на «Запустить этот .bat»? Или, может быть, полностью изменить поведение команды выключения?

  3. Программно перехватить сообщение выключения, прервать выключение, запустить командный файл, повторно инициировать выключение. Было некоторое обсуждение перехвата выключения, например здесь , здесь, и здесь , но я все еще слишком много разбираюсь во всех языках, кроме, может быть, Ruby или Java, чтобы действительно понять, можно ли и как это сделать в этом случае. Если кто-то может прояснить, как на самом деле сделать эту работу (не застревая на экране «Принудительное закрытие»), то я Я очень хочу опробовать любой язык, который вы предлагаете.

8
задан Cœur 27 April 2017 в 17:47
поделиться