Führen Sie eine Stapeldatei unter Windows 7 aus, bevor Sie die Programme schließen (vorzugsweise auf der Netzschaltfläche Drücken).

StackOverflow https://stackoverflow.com/questions/4782944

Frage

Ich habe eine Windows 7 -Box mit mehreren VMware -Player -Maschinen, die mit dem Boot gestartet werden. Ich verwende WMware VIX und eine Stapeldatei, um die virtuellen Maschinen wie SO zu herunterzufahren:

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

Was ich erreichen möchte, ist, diese Befehle auszuführen, wenn der Host -Computer heruntergefahren wird, damit ich jede VM nicht separat herunterschalten muss. Beim Bereitstellen werden wahrscheinlich das Herunterfahren mit einem kurzen Drücken der ACPI -Netzschaltfläche gestartet, nicht über das Startmenü. Wege, die ich versucht habe, die nicht funktionieren (zumindest nicht gut genug):

  1. Gruppenrichtlinien - Der offensichtlichste Weg, aber in Windows 7 ist die Option, das Abschaltskripte asynchron auszuführen, verschwunden.
    Das Ergebnis ist, dass Windows Erste Sagt allen offenen Windows zum Schließen, die VMs antworten, dass sie verwendet werden, und Sie erhalten den Dialog "Force Close". Nur nach VMware Player und alles andere ist geschlossen, sind die Skripte, die ausgeführt werden, und nicht zu verwenden.
    Sie würden denken, dass dies geändert werden könnte, aber ich denke, ich erinnere mich, dass ich einige offizielle MS -Note in der Art von "Nope, sorry" gesehen habe. Ich kann den Link jedoch nicht finden.

  2. Verwenden Sie eine Stapeldatei, die alle VMs schließt und den Host dann als Desktop -Verknüpfung anstelle der üblichen Schaltfläche zum Herunterfahren herunterfällt. - Funktioniert, und das ist das, was ich gerade benutze, während ich mich entwickeln kann.
    Die Verwendung der ACPI-Netzschaltfläche initiiert jedoch ein normales Herunterfahren mit dem gleichen Ergebnis wie früher, und es wäre besser, wenn der Endbenutzer, der die Maschine täglich ein- und ausschaltet, keinen Monitor und eine Maus verwenden müsste.
    Was ich im Moment googele, ist eine Möglichkeit, die auf den physischen Ein- /gestellten Taste aufgerufene Aktion zu ändern. Mit Windows können Sie zwischen verschiedenen Aktionen wie Schlaf, Winterschlaf, Neustart usw. auswählen, aber könnten Sie dies in "Ausführen dieser .bat" ändern? Oder ändern Sie das Verhalten des Shutdown -Befehls insgesamt?

  3. Programmgesteuert die Shutdown-Nachricht abfangen, das Herunterfahren abbrechen, die Stapeldatei ausführen und das Abschalten neu initiieren. Es gab einige Diskussionen über das Abfangen des Stillstands EG hier, hier und hier, aber ich bin immer noch zu viel von einem N00B in allen Sprachen, außer vielleicht Ruby oder Java, um wirklich zu verstehen, ob und wie es in diesem Fall getan werden könnte. Wenn jemand klarstellen kann, wie man diese Funktion macht (ohne auf dem Bildschirm "Force Close" zu stecken), dann bin ich gespannt, dass Sie jede Sprache ausprobieren, die Sie anbieten.

War es hilfreich?

Lösung

Okay, also fand ich eine Lösung, die für mich funktioniert hat; Ein Tool namens AutoHotkey_l und ein Skript nach diese Themen In den Autohotkey -Foren.

Dies ist der Code, den ich verwende, und ich schlage vor, über Autohotkey -Befehle in der zu lesen Dokumentation. Ich optimiere den Code, während ich lerne, was er tatsächlich tut, aber im Moment funktioniert das. :)

#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

Im Moment unterscheidet es nur zwischen Abmelden und Herunterfahren, aber dieser Beitrag Hat eine einfache GUI in HTML, mit der der Benutzer auswählen kann, ob er neu starten, Winterschlaf usw.

In meinem Fall ist es in Ordnung, das Abschalten zu unterbrechen und die Batch -Datei auszuführen, unabhängig davon, ob VMware ausgeführt wird oder nicht. Sie können jedoch eine Bedingung dafür festlegen, beispielsweise wie folgt:

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

Ich bin bereits auf Probleme mit diesem Skript gestoßen, als wenn der Host so verlangsamt wird (Speicherleckage), dass der Bildschirm "Force Shudown" nicht rechtzeitig angezeigt wird, damit das Skript es schließt. Und es würde wahrscheinlich davon profitieren, die Anzahl der Versuche im Auge zu behalten, damit es zwangsläufig herunterfahren könnte, wenn der erste Versuch fehlschlägt.

Zumindest gut genug. Und ich brauche doch nicht einmal eine Virtualisierung für mein Projekt, aber hoffentlich kann es jemand anderem helfen. Alternative Lösungen sind immer noch sehr willkommen.

Andere Tipps

Ich habe diese Lösung für das gleiche Problem entwickelt:http://communities.vmware.com/thread/334740

Der Trick, an der "Force Close" vorbei zu kommen, besteht darin, zuerst alle VMs zu suspendieren/zu stoppen und dann das Herunterfahren im selben Skript erneut auszugeben. Es scheint für mich zu funktionieren.

Workstation hat die Präferenz, "VMs nach dem Schließen der Workstation am Laufen zu halten". Hat VMware Player die gleiche Option?

Die Art und Weise, wie ich dies sehe, funktioniert: Aktivieren Sie die obige Präferenz. Das Fenster schließt und lässt die VMs laufen. Der Abschaltvorgang kann dann von Nr. 1 mit Ihrem Skript fortgesetzt werden, wodurch die VMs vor dem Beenden herunterfahren/ausgesetzt werden sollten.

Ich habe selbst keine Spieler -VMs, also kann ich das nicht testen, aber ich hoffe, es hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top