Windows 7 关闭程序前,在Windows 7上运行批处理文件关机(最好是在按下电源按钮时)
我有一个Windows 7机箱,其中有多台VMWare Player机器,这些机器在启动时启动。我使用WMWare VIX和批处理文件关闭虚拟机,如下所示:Windows 7 关闭程序前,在Windows 7上运行批处理文件关机(最好是在按下电源按钮时),windows-7,batch-file,vmware,shutdown,acpi,Windows 7,Batch File,Vmware,Shutdown,Acpi,我有一个Windows 7机箱,其中有多台VMWare Player机器,这些机器在启动时启动。我使用WMWare VIX和批处理文件关闭虚拟机,如下所示: "C:\path\to\VMWare VIX\vmrun.exe" -T player stop "C:\path\to\machine.vmx" soft 我想要完成的是在主机关闭时运行这些命令,这样我就不需要单独关闭每个VM。部署后,可能会通过短按ACPI电源按钮而不是从“开始”菜单开始关机。我尝试过的不起作用的方法(至少不够好):
"C:\path\to\VMWare VIX\vmrun.exe" -T player stop "C:\path\to\machine.vmx" soft
我想要完成的是在主机关闭时运行这些命令,这样我就不需要单独关闭每个VM。部署后,可能会通过短按ACPI电源按钮而不是从“开始”菜单开始关机。我尝试过的不起作用的方法(至少不够好):
结果是Windows首先通知所有打开的窗口关闭,虚拟机响应它们正在使用,然后您会看到“强制关闭”对话框。只有在VMWare Player和其他所有内容关闭后,脚本才会运行,没有任何用处。
你可能会认为这是可以改变的,但我记得我看到过一些官方的MS注释,大意是“不,对不起”。但是找不到链接
但使用ACPI电源按钮启动正常关机,结果与之前相同,如果每天打开和关闭机器的最终用户不需要使用监视器和鼠标,则效果会更好。
所以,我现在在谷歌上搜索的是一种修改按下物理电源按钮时调用的操作的方法。Windows允许您在睡眠、休眠、重新启动等不同操作之间进行选择,但您能否将其更改为“runthis.bat”?或者完全改变关机命令的行为
工作站的首选项是“在工作站关闭后保持虚拟机运行”。VMware player是否有相同的选项 我认为这是可行的:启用上述首选项。窗口关闭,让虚拟机运行。然后,关闭过程可以从#1继续执行脚本,该脚本应该在终止之前关闭/挂起VM
我自己没有任何玩家虚拟机,所以我无法测试,但我希望它能有所帮助。好的,所以我找到了一个适合我的解决方案;一个名为AutoHotkey_L的工具和一个根据AutoHotkey论坛制作的脚本 这是我正在使用的代码,我建议您阅读中的自动热键命令。我在了解代码的实际功能时,正在对代码进行调整,但目前这一切都很有效。:) 所以现在它只区分注销和关机,但有一个简单的HTML GUI,让用户选择是否要重新启动、休眠等 在我的例子中,无论VMware是否正在运行,都可以中断关机并运行批处理文件,但您可以为其设置一个条件,例如:
IfWinExist, ahk_class VMPlayerFrame {
SetTimer, RunBeforeShutdown, On
Return false
} Else {
Return true
}
我已经遇到了这个脚本的问题,比如主机速度太慢(内存泄漏),以至于“强制关机”屏幕无法及时出现,脚本无法关闭它。它可能会从跟踪尝试次数中获益,这样,如果第一次尝试失败,它就可以强制关闭
至少现在已经足够好了。我的项目可能根本不需要虚拟化,但希望它能帮助其他人。替代解决方案仍然非常受欢迎。我为同样的问题提出了以下解决方案:
通过“强制关闭”的诀窍是首先暂停/停止所有虚拟机,然后在同一脚本中重新发出关闭命令。这似乎对我很有用。根据我的经验,大多数工作站的首选项都可以在Player中手动设置,方法是根据每个VM修改.vmx文件,或者在%appdata%\VMware中修改preferences.ini。(关于设置哪些参数有很好的参考。)我尝试在preferences.ini中设置
pref.backgroundOnClose=“true”
,但在关闭窗口时仍会关闭。此外,在关机时,我仍然停留在“强制关闭”屏幕上。但是好主意,我将处理设置并报告。好的,所以参数是pref.vmplayer.exit.vmAction=“disconnect”
,它在手动关闭时执行它所说的操作(在Win7上有一条额外的错误消息,在XP上则不是这样)。但是当关闭主机时,主机播放机会一如既往地报告机器正在使用中,即使在断开连接的状态下也不会关闭。可能会尝试工作站,但我很怀疑。我不再能够尝试这个,但它看起来很有希望。你能描述一下你的最终设置吗?这将有利于未来的读者了解什么样的具体设置最终起作用。
IfWinExist, ahk_class VMPlayerFrame {
SetTimer, RunBeforeShutdown, On
Return false
} Else {
Return true
}