6

我最近编写的 CMD 批处理文件遇到了一些问题。这应该在工作中启动我的开发环境,并且在大多数情况下它可以工作:

@echo off
start cmd.exe
start notepad++.exe
start sublime_text.exe
start outlook.exe
start communicator.exe
start "* Starting VirtualBox ..." virtualbox.exe
start sh.exe
start firefox.exe

我面临的挑战是我想启动 git-bash,(sh.exe),但在企业配置中,virtualbox 必须为 vagrant 启动并运行,vagrant 是一个基于 shell 的 virtualbox 管理器才能正确加载。因此,由于这种依赖性,我需要在启动 git-bash shell (sh.exe) 之前启动 virtualbox.exe 并完全完成加载(我们不需要“启动”和框)。

我已经搜索过,但不知道如何做到这一点。我不断得到结果推荐:

  • /等待
  • ping localhost (n) 次以创建计时器黑客

这些选项的问题是 /wait 在关闭 VirtualBox 之前不会移动到下一个命令——这不是我想要的。第二个选项是基于时间的等待,在这种情况下也不能解决我的问题。

我究竟做错了什么?

4

4 回答 4

6

哇!感谢保罗的灵感。

发现了一个绝好的机会!

我正在使用命令浏览 build-it 来宾操作系统属性:

 VBoxControl guestproperty enumerate -patterns *

我找到了一个不错的属性“ /VirtualBox/GuestInfo/OS/LoggedInUsers

在来宾操作系统引导期间,此属性从“未设置值!”更改。通过值“0”到“1”(如果用户自动登录)。在 Windows 和 linux 上都可以正常工作。

>VBoxManage guestproperty get "WIN7_32" "/VirtualBox/GuestInfo/OS/LoggedInUsers"
No value set!

>VBoxManage guestproperty get "WIN7_32" "/VirtualBox/GuestInfo/OS/LoggedInUsers"
Value: 0

>VBoxManage guestproperty get "WIN7_32" "/VirtualBox/GuestInfo/OS/LoggedInUsers"
Value: 1

因此,您无需在来宾操作系统上的启动中添加任何内容!甜的!

您甚至可以使用wait

VBoxManage guestproperty wait "WIN7_32" "/VirtualBox/GuestInfo/OS/LoggedInUsers"

但请记住,一旦客户操作系统到达欢迎屏幕,此命令将返回 0

于 2015-10-12T07:52:15.260 回答
2

执行此操作的“最佳”方法是在主机上使用 VBoxManage,并在来宾机器上使用属性结合 VBoxControl。

它的工作方式是主机将等待设置属性,而当您认为机器已“加载”时,客户机将设置此属性。对我来说,我只是从登录脚本中设置属性。

所以在我的 Linux 主机上,我说:

VBoxManage guestproperty wait My_Virtual_Machine_Name Wait_For_Logon_Event

这将永远等待/阻塞,您可以根据需要添加超时。

然后在登录脚本或机器启动脚本中的 Windows 客户机上执行:

VBoxControl guestproperty set Wait_For_Logon_Event Event_Now_Set

然后这会导致在主机端继续执行:

Name: Wait_For_Logon_Event, value: Event_Now_Set, flags:
于 2014-04-22T02:10:08.317 回答
1

正如您所观察到的,一旦虚拟机实际打开,VirtualBox/VBoxManage 进程将返回并退出。没有一种在启动时挂接到来宾的好方法,尽管您可以做的一件事是指示 VirtualBox 运行命令并检查退出代码。我会在启动来宾 VM 之后但在您想要启动之前将此代码插入到您的批处理文件脚本中sh.exe

:CheckVBox
VBoxManage guestcontrol Win8 exec --image c:\Windows\System32\ipconfig.exe --wait-exit --username Goyuix --password VirtualBoxRox
IF NOT ERRORLEVEL 0 (
  REM Do something to sleep here, pinging localhost or timeout
  GOTO CheckVBox
)
REM VM Ready, go ahead and fire up other apps that depend on it

注意:您需要VBoxManage在 PATH 环境变量中包含可执行文件的路径。在 Windows 上,它通常是:C:\Program Files\Oracle\VirtualBox

当然,您可能需要更强大的东西ipconfig来检测虚拟机是否真的准备好了。我不确定您将依赖哪些服务等,但这可能足以让您度过难关,并且当然可以适应检查服务状态等。

于 2013-06-26T03:04:13.923 回答
0

LoggedInUsers似乎不再适用于wait(VirtualBox 5.2.22),get但确实有效。所以我切换到另一个属性:

VBoxManage guestproperty wait <host> "/VirtualBox/GuestInfo/OS/NoLoggedInUsers"

由于我们只是在等待此属性可用,因此您可能会使用/VirtualBox/GuestInfo/OS不可用于非运行机器的任何 guest 属性。您可以通过以下方式找到它们

vboxmanage guestproperty enumerate <host> | grep GuestInfo/OS

<host>应该在哪里跑步。然后将该列表与非运行机器的列表进行比较。

于 2018-12-02T13:45:39.220 回答