2011-01-24 2 views
8

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

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

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

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

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

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

ответ

3

Хорошо, поэтому я нашел решение, которое сработало для меня; инструмент под названием AutoHotkey_L и скрипт, сделанный в соответствии с thesethreads на форумах AutoHotkey.

Это код, который я использую, и предлагаю читать команды AutoHotkey в documentation.Я настраиваю код, когда узнаю, что он на самом деле делает, но пока это работает. :)

#NoEnv 
#Persistent 
SendMode Input 
SetWorkingDir %A_ScriptDir% 
SetTimer, RunBeforeShutdown, Off 

Gui,+LastFound 
hwnd:=WinExist() 
DllCall("ShutdownBlockReasonCreate","Uint",hwnd,"Str","") 
DllCall("kernel32.dll\SetProcessShutdownParameters", UInt, 0x4FF, UInt, 0) 
;puts us first in line for getting the shutdown call, i guess? 
OnMessage(0x11, "WM_QUERYENDSESSION") 
Return 

WM_QUERYENDSESSION(wParam, lParam) 
{ 
    ENDSESSION_Logoff = 2147483648 
    If (lParam == ENDSESSION_Logoff) { 
     global EventType = "Logoff" 
    } Else { 
     global EventType = "Shutdown" 
     ;no way to distinguish between shutdown and restart 
    } 

    SetTimer, RunBeforeShutdown, On 
    Return false 
} 

runBeforeShutdown: 
    SetTimer, RunBeforeShutdown, Off 
    Sleep, 1000 
    SendInput, {ENTER} ; gets us past the 'Force shudown' screen 
    Sleep, 1000 
    #SingleInstance, Force 
    DllCall("ShutdownBlockReasonDestroy","Uint",hwnd) 
    ; **** Your commands go here **** 
    RunWait shutdown.bat 
    ; ******** 

    If (EventType == "Logoff") { 
     Shutdown, 0 
    } Else { 
     Shutdown, 1 
    } 
    Reload 
Return 

Так прямо сейчас различает только выход из системы и завершения работы, но this post имеет простой графический интерфейс в формате HTML, который позволяет пользователю выбрать, если они хотят, чтобы перезагрузить, спящий режим и т.д.

В моем случае это хорошо прервать завершение работы и запустить командный файл, независимо от того, работает или нет VMware, но вы можете задать условие для этого, например, так:

IfWinExist, ahk_class VMPlayerFrame { 
    SetTimer, RunBeforeShutdown, On 
    Return false 
} Else { 
    Return true 
} 

Я уже столкнулся с проблемами с этим сценарием, как, когда хост настолько замедлен вниз (утечка памяти), чтобы экран «Force shudown» не появлялся вовремя, чтобы сценарий закрыл его. И это, вероятно, выиграет от отслеживания количества попыток, чтобы он мог принудительно отключиться, если первая попытка не удалась.

Достаточно хорошо на данный момент. И мне даже не нужна виртуализация для моего проекта, но, надеюсь, это может помочь кому-то другому. Альтернативные решения по-прежнему очень приветствуются.

0

Рабочая станция имеет предпочтение «Сохранять виртуальные машины после закрытия рабочей станции». У лидера VMware такая же опция?

Способ, которым я вижу это: Разрешить вышеуказанное предпочтение. Окно закрывается, оставляя виртуальные машины. Затем процесс завершения работы может продолжить ваш скрипт с # 1, который должен завершить или приостановить виртуальные машины до завершения.

У меня нет собственных виртуальных машин, поэтому я не могу проверить это, но надеюсь, что это поможет.

+0

По моему опыту, большинство настроек рабочих станций можно установить вручную в проигрывателе, изменив либо файл .vmx на основе каждой виртуальной машины, либо файл preferences.ini в% appdata% \ VMware. ([Sanbarrow.com] (http://sanbarrow.com/vmx.html) имеет отличную ссылку на то, какие параметры нужно установить.) Я попытался установить 'pref.backgroundOnClose =" true "' в preferences.ini, но он все еще отключается вниз при закрытии окна. Кроме того, при выключении я все еще застрял на экране «Force close». Но отличная идея, я буду играть с настройками и отчитываться. – lime

+0

Хорошо, поэтому параметр 'pref.vmplayer.exit.vmAction =" disconnect "' и делает то, что он говорит при закрытии вручную (с бонусным сообщением об ошибке на Win7, а не на XP). Но при выключении хост-плеер как всегда сообщает, что машина используется, и не закрывается даже в этом отключенном состоянии. Можете попробовать с рабочей станцией, но я сомневаюсь. – lime

1

Я пришел с этим решением той же задачи: http://communities.vmware.com/thread/334740

Хитрость, чтобы получить мимо «силы близко» должна первой приостановить/остановить все виртуальные машины затем переоформить выключение в том же сценарии , Кажется, это работает для меня.

+1

Я больше не могу попробовать это, но выглядит многообещающим. Вы могли бы описать свою окончательную настройку? Было бы хорошо, если бы будущие читатели знали, какие конкретные настройки работают в конце. – lime

Смежные вопросы