用于注销无法访问的 VirtualBox 的批处理文件
Batch file to unregister inaccessible VirtualBox
我遇到无法访问的 VirtualBox 机器冻结 VirtualBox 的问题,然后需要通过 Windows 任务管理器重置。这些 VirtualBox 实例已经由 .bat 文件启动,因此我想在 .bat 中包含代码以在启动之前(仅)取消注册无法访问的机器。首选是不将文件写入磁盘,因此我尝试使用 var 来执行此操作。我有以下代码,它将回显任何当前无法访问的机器:
ECHO OFF
SET LOCAL ENABLEDELAYEDEXPANSION
SET var=%%F
FOR /F "tokens=* USEBACKQ" %%F IN (`"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms`) DO (
ECHO.%var% | FIND /I "inaccessible">Nul && ( ECHO %var% )
)
我不太确定这是在循环中使用查找的正确方法,但无论如何我在找到无法访问的机器后想要实现的是使用它的 UUID 来注销它:
SET SUBSTRING=%UUID:~18,-1%
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" unregistervm %SUBSTRING% > nul)
帮助解决这个难题的两个部分,非常感谢。
这就是您将它们放在一起的方式。我不能肯定地测试它,因为我没有 vboxmanage,但你应该能够完成这项工作。
@ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=*" %%F IN ('""C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms | FIND /i "inaccessible""') DO (
SET SUBSTRING=%%F
SET SUBSTRING=!SUBSTRING:~18,-1!
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" unregistervm !SUBSTRING!
)
棘手的部分是弄清楚如何让 Batch 解释路径和 find
字符串周围的引号。最后,我只是将整个字符串用引号括起来,它起作用了。 (另外:您通常必须转义 |
,但当整个内容都用引号引起来时就不必转义了。)
此外,如果您在 for
中正确识别您的标记和分隔符,则不必进行子字符串替换(和延迟扩展),但由于我不知道 vboxmanage 的输出,我帮不了你。
我遇到无法访问的 VirtualBox 机器冻结 VirtualBox 的问题,然后需要通过 Windows 任务管理器重置。这些 VirtualBox 实例已经由 .bat 文件启动,因此我想在 .bat 中包含代码以在启动之前(仅)取消注册无法访问的机器。首选是不将文件写入磁盘,因此我尝试使用 var 来执行此操作。我有以下代码,它将回显任何当前无法访问的机器:
ECHO OFF
SET LOCAL ENABLEDELAYEDEXPANSION
SET var=%%F
FOR /F "tokens=* USEBACKQ" %%F IN (`"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms`) DO (
ECHO.%var% | FIND /I "inaccessible">Nul && ( ECHO %var% )
)
我不太确定这是在循环中使用查找的正确方法,但无论如何我在找到无法访问的机器后想要实现的是使用它的 UUID 来注销它:
SET SUBSTRING=%UUID:~18,-1%
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" unregistervm %SUBSTRING% > nul)
帮助解决这个难题的两个部分,非常感谢。
这就是您将它们放在一起的方式。我不能肯定地测试它,因为我没有 vboxmanage,但你应该能够完成这项工作。
@ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=*" %%F IN ('""C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms | FIND /i "inaccessible""') DO (
SET SUBSTRING=%%F
SET SUBSTRING=!SUBSTRING:~18,-1!
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" unregistervm !SUBSTRING!
)
棘手的部分是弄清楚如何让 Batch 解释路径和 find
字符串周围的引号。最后,我只是将整个字符串用引号括起来,它起作用了。 (另外:您通常必须转义 |
,但当整个内容都用引号引起来时就不必转义了。)
此外,如果您在 for
中正确识别您的标记和分隔符,则不必进行子字符串替换(和延迟扩展),但由于我不知道 vboxmanage 的输出,我帮不了你。