2011-01-24 9 views
8

Ho una casella di Windows 7 con più macchine VMWare Player avviate all'avvio. Io uso WMware VIX e un file batch per l'arresto delle macchine virtuali in questo modo:Eseguire un file batch sull'arresto di Windows 7 prima di chiudere i programmi (preferibilmente premere il pulsante di accensione)

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

Quello che voglio realizzare è quello di eseguire questi comandi quando la macchina host è spento, in modo che non ho bisogno di chiudere giù ogni VM separatamente. Una volta implementato, gli arresti verranno probabilmente avviati con una breve pressione del pulsante di accensione ACPI, non dal menu Start. Modi che ho provato che non funzionano (o almeno non abbastanza bene):

  1. criteri di gruppo - il modo più ovvio per andare, ma in Windows 7, la possibilità di eseguire gli script in modo asincrono shutdown '' è andato.
    Il risultato è che Windows prima indica a tutte le finestre aperte di chiudersi, le macchine virtuali rispondono che sono in uso e si ottiene la finestra di dialogo "Chiusura forzata". Solo dopo VMWare Player e tutto il resto è chiuso vengono eseguiti gli script, per non utilizzare.
    Si potrebbe pensare che questo potrebbe essere cambiato, ma penso di ricordare di aver visto alcune note ufficiali della MS sulla falsariga di "no, scusa". Non riesco a trovare il collegamento però.

  2. Utilizzare un file batch che chiude tutte le macchine virtuali e quindi arresta l'host come collegamento sul desktop anziché il solito pulsante di arresto. - Funziona, e questo è quello che sto usando in questo momento durante lo sviluppo.
    Tuttavia, l'utilizzo del pulsante di accensione ACPI avvia un normale arresto con lo stesso risultato di prima e sarebbe meglio se l'utente finale che accende e spegne la macchina ogni giorno non avrebbe bisogno di utilizzare un monitor e un mouse .
    Quindi quello che sto cercando su google in questo momento è un modo per modificare l'azione chiamata quando si preme il pulsante di accensione fisica. Windows ti permette di scegliere tra alcune azioni diverse come Sleep, Hibernate, Restart etc, ma potresti cambiarlo in 'Esegui .bat'? O forse cambia il comportamento del comando shutdown del tutto?

  3. Intercettare programmaticamente il messaggio di arresto, interrompere l'arresto, eseguire il file batch, riavviare l'arresto. C'è stata una discussione sull'intercettazione dell'arresto, ad es. here, here e here, ma sono ancora troppo di un n00b in tutte le lingue tranne forse Ruby o Java per capire veramente se e come potrebbe essere fatto in questo caso. Se qualcuno può chiarire come fare realmente questo lavoro (senza rimanere bloccato sulla schermata 'Forza chiusura'), allora sono desideroso di provare qualsiasi lingua tu offra.

risposta

3

Ok, quindi ho trovato una soluzione che ha funzionato per me; uno strumento chiamato AutoHotkey_L e uno script realizzato secondo thesethreads nei forum AutoHotkey.

Questo è il codice che sto utilizzando e suggerisco di leggere i comandi AutoHotkey nello documentation.Sto modificando il codice mentre imparo cosa sta facendo in realtà, ma per ora funziona. :)

#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 

Così adesso si distingue solo tra disconnessione e l'arresto, ma this post ha una semplice interfaccia grafica in HTML che consente all'utente di scegliere se vogliono riavviare, ibernare ecc

Nel mio caso si tratta di Va bene per interrompere l'arresto ed eseguire il file batch indipendentemente dal fatto che VMware è in esecuzione o meno, ma è possibile impostare una condizione per esso, ad esempio in questo modo:

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

ho già incorrere in problemi con lo script, come quando l'ospite è così rallentato down (memory leakage) che la schermata "Force shudown" non apparirà in tempo perché lo script possa chiuderla. E probabilmente trarrebbe beneficio dal tenere traccia del numero di tentativi, in modo che possa spegnersi forzatamente se la prima prova fallisce.

Abbastanza buono per ora almeno. E forse non ho nemmeno bisogno della virtualizzazione per il mio progetto, ma spero che possa aiutare qualcun altro. Le soluzioni alternative sono ancora benvenute.

0

La workstation ha la preferenza su "Mantieni VM in esecuzione dopo la chiusura della Workstation". Il lettore VMware ha la stessa opzione?

Il modo in cui vedo funzionare: Abilitare la preferenza di cui sopra. La finestra si chiude, lasciando in esecuzione le macchine virtuali. Il processo di spegnimento può quindi continuare con il tuo script dal numero 1, che dovrebbe arrestare/sospendere i VM prima di terminare.

Non ho VM Player, quindi non posso verificarlo, ma spero che sia d'aiuto.

+0

In base alla mia esperienza, la maggior parte delle preferenze di Workstation può essere impostata manualmente in Player modificando il file .vmx per VM o il file preferences.ini in% appdata% \ VMware. ([Sanbarrow.com] (http://sanbarrow.com/vmx.html) ha un eccellente riferimento su quali parametri impostare.) Ho provato a impostare 'pref.backgroundOnClose =" true "' in preferences.ini, ma chiude comunque giù alla chiusura della finestra. Inoltre, allo spegnimento continuo a rimanere bloccato sulla schermata 'Force close'. Ma ottima idea, giocherò con le impostazioni e riferirò. – lime

+0

Ok, quindi il parametro è 'pref.vmplayer.exit.vmAction =" disconnect "' e fa quello che dice quando si chiude manualmente (con un messaggio di errore bonus su Win7, non su XP). Tuttavia, quando si spegne, il lettore host segnala come sempre che la macchina è in uso e non si chiude nemmeno in questo stato disconnesso. Potrebbe provare con Workstation, ma sono dubbioso. – lime

1

Sono venuto su con questa soluzione per lo stesso problema: http://communities.vmware.com/thread/334740

Il trucco per superare la "forza vicino" è alla prima sospensione/fermare tutte le macchine virtuali quindi ristampare l'arresto nello stesso script . Sembra funzionare per me.

+1

Non riesco più a provarlo, ma sembra promettente. Saresti in grado di descrivere la tua configurazione finale? Sarebbe positivo per i futuri lettori sapere quali impostazioni specifiche hanno funzionato alla fine. – lime

Problemi correlati