2011-01-24 8 views
8

Tengo una caja de Windows 7 con varias máquinas VMware Player que se inician en el arranque. Yo uso WMware VIX y un archivo por lotes para apagar las máquinas virtuales, así:ejecutar un archivo por lotes en Windows 7 de conclusión antes de cerrar los programas (de preferencia en el botón de encendido prensa)

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

Lo que quiero lograr es ejecutar estos comandos cuando el ordenador central se cierra, por lo que no es necesario apagar abajo cada VM por separado. Cuando se implementa, es probable que se inicien apagados presionando brevemente el botón de encendido ACPI, no desde el menú Inicio. Maneras que he probado que no funcionan (por lo menos no lo suficientemente bien):

  1. Políticas del Grupo - La manera más obvia de ir, pero en Windows 7, la opción de ejecutar secuencias de comandos de apagado es '' de forma asíncrona ido.
    El resultado es que Windows primera dice todas las ventanas abiertas para cerrar, las máquinas virtuales responden que están en uso y se obtiene el cuadro de diálogo 'Forzar cierre'. Solo después de VMWare Player y todo lo demás está cerrado si los scripts se ejecutan, si no se usan.
    Pensarías que esto podría cambiarse, pero creo que recuerdo haber visto alguna nota oficial de MS en la línea de "no, perdón". Sin embargo, no puedo encontrar el enlace.

  2. Utilice un archivo por lotes que cierre todas las máquinas virtuales y luego apague el host como un acceso directo de escritorio en lugar del botón de apagado habitual. - Funciona, y eso es lo que estoy usando ahora mismo mientras desarrollo.
    Pero usando el botón de encendido ACPI inicia un apagado normal con el mismo resultado que antes, y sería mejor si el usuario final que hace girar la máquina y fuera sobre una base diaria no tendría que usar un monitor y un ratón .
    Por lo tanto, estoy buscando en Google por el momento es una forma de modificar la acción llamada al presionar el botón de encendido físico. Windows le permite elegir entre algunas acciones diferentes, como Dormir, Hibernar, Reiniciar, etc., pero ¿podría cambiar eso a 'Ejecutar este .bat'? O tal vez cambiar el comportamiento del comando de apagado por completo?

  3. programación interceptar el mensaje de apagado, abortar el apagado, ejecutar archivos por lotes, vuelva a iniciar el apagado. Se ha debatido sobre la interceptación del apagado, p. here, here y here, pero aún soy demasiado n00b en todos los idiomas, excepto quizás Ruby o Java para comprender realmente cómo y cómo se podría hacer en este caso. Si alguien puede aclarar cómo hacer que esto funcione realmente (sin quedarse atascado en la pantalla de 'Forzar cierre'), estoy ansioso por probar cualquier idioma que ofrezcas.

Respuesta

3

Bien, entonces encontré una solución que funcionó para mí; una herramienta llamada AutoHotkey_L y una secuencia de comandos hecha según thesethreads en los foros de AutoHotkey.

Este es el código que estoy usando, y sugiero leer sobre AutoHotkey comandos en el documentation.Estoy retocando el código mientras aprendo lo que realmente está haciendo, pero por ahora esto funciona. :)

#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 

Así que ahora sólo se distingue entre el cierre de sesión y apagado, pero this post tiene una interfaz gráfica de usuario simple en HTML que permite al usuario elegir si quieren reiniciar, hibernar, etc.

En mi caso es bien para interrumpir el apagado y ejecutar el archivo por lotes, independientemente de si VMware está funcionando o no, pero se puede establecer una condición para ello, por ejemplo, así:

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

ya he tenido problemas con este guión, como cuando el anfitrión está tan lento abajo (pérdida de memoria) que la pantalla "Force shudown" no aparecerá a tiempo para que el script lo cierre. Y probablemente se beneficiaría de mantener un registro de la cantidad de intentos, de modo que se pueda cerrar a la fuerza si falla la primera.

Lo suficientemente bueno por ahora al menos. Y quizás ni siquiera necesite virtualización para mi proyecto, pero espero que pueda ayudar a alguien más. Las soluciones alternativas son muy bienvenidas.

0

La estación de trabajo tiene la preferencia 'Mantener las máquinas virtuales en ejecución después de que la estación de trabajo se cierre'. ¿El reproductor de VMware tiene la misma opción?

La forma en que veo que esto funciona: Habilite la preferencia anterior. La ventana se cierra, dejando las máquinas virtuales en funcionamiento. El proceso de apagado puede continuar con su secuencia de comandos desde # 1, que debe apagar/suspender las máquinas virtuales antes de finalizar.

que no tienen ningún jugador VM mí mismo, por lo que no se puede probar esto, pero espero que ayude.

+0

Según mi experiencia, la mayoría de las preferencias de estaciones de trabajo pueden configurarse manualmente en Player modificando el archivo .vmx por VM o las preferences.ini en% appdata% \ VMware. ([Sanbarrow.com] (http://sanbarrow.com/vmx.html) tiene una referencia excelente sobre los parámetros que se deben establecer.) Intenté configurar 'pref.backgroundOnClose =" true "' en preferences.ini, pero todavía se cierra abajo al cerrar la ventana. Además, al apagar todavía me quedo atascado en la pantalla 'Force cerrar'. Pero gran idea, jugaré con la configuración e informaré. – lime

+0

Está bien, entonces el parámetro es 'pref.vmplayer.exit.vmAction =" disconnect "' y hace lo que dice cuando se cierra manualmente (con un mensaje de error adicional en Win7, no en XP). Pero al apagar el host, el reproductor informa como siempre que la máquina está en uso y no se cerrará incluso en este estado desconectado. Podría intentar con Workstation, pero estoy dudoso. – lime

1

he llegado con esta solución al mismo problema: http://communities.vmware.com/thread/334740

El truco para conseguir más allá de la "fuerza de cierre" es suspender/parada de todas las máquinas virtuales a continuación, volver a emitir el cierre en el mismo guión primero . Parece que funciona para mí.

+1

Ya no puedo probar esto, pero parece prometedor. ¿Serías capaz de describir tu configuración final? Sería bueno para los lectores futuros saber qué configuraciones específicas funcionaron al final. – lime

Cuestiones relacionadas