首页 > 解决方案 > Vboxmange 命令产生新窗口 - 使用 go os.exec 测试运行 - 为什么 - 我该如何修复?

问题描述

尝试调试在 Win7 上运行 vboxmange 的 docker-machine 的问题。无法使用 docker-machine,因为它无法捕获 vboxmanage 命令的输出(生成一个单独的窗口来运行 VBoxManage 命令)。

使用以下测试代码运行 vboxmange 命令,它会生成一个新窗口,因此标准输出为空;

package main

import (
    "bytes"
    "fmt"
    "log"
    "os/exec"
)


func main() {
    cmd := exec.Command("C:\\Program Files\\Oracle\\VirtualBox\\vboxmanage.exe", "--version")
    //cmd := exec.Command("C:\\Program Files\\Docker Toolbox\\docker.EXE", "help")

    var stdout bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &stdout
    cmd.Stderr = &stderr

    err := cmd.Run()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("StdOut: %q\n", stdout.String())
}

如果我运行 docker 命令(上面已注释掉),该命令运行时不会产生新窗口,并且会捕获输出。

仅供参考,我正在使用 VBoxManage 版本 5.2.8r121009

我意识到这可能与我的 Win7 环境有关,但我找不到解决方案 - 感谢帮助!

编辑:如果我在同一个提示符下运行 VBoxManage 命令并重定向到一个文件 - 它可以正常工作,所以这非常令人费解!

EDIT2:这不是 golang 问题,因为我也可以在 python 中重新创建问题。在同一个命令行中再次正常工作,“vboxmanage.exe --version > output.txt”在同一个 cmd 窗口中运行,但是当在下面运行这个片段时,它会产生一个新窗口;

import subprocess
result = subprocess.run(['C:\\Program Files\\Oracle\\VirtualBox\\vboxmanage.exe', '--version'], stdout=subprocess.PIPE)
print('stdout:', result.stdout)

所以这一定是 VBoxmanage 的问题!(删除了 go 标签)

编辑3:

我已经用 Docker 和 Oracle 开了票,但我没有太大希望......

标签: virtualbox

解决方案


问题似乎是环境问题,而不是 docker、virtual box 或 windows 的原因。请看线程;https://github.com/docker/machine/issues/4548

我发现不是炭黑导致我的系统出现问题!

CB 日志文件 (confer.log) 非常有用,所以我浏览了它们。启动 vboxmanage 时,我注意到 docker-machine 和我的 vboxtest.exe 都被拦截,并且 vboxmanage 正在由 windows\system32\pmlauncher.exe 运行,谷歌搜索表明这是 AVG,但如果你检查文件则不是描述为“ BeyondTrust PowerBroker for Windows Launcher ”。

有一个 BeyondTrust PowerBroker 服务,所以我停止了它,然后 vboxtest.exe 和 docker-machine 命令都可以工作......

<stopped beyond trust>

C:\temp>testvbox
StdOut: "5.2.16r123759\r\n"

<started beyond trust>

C:\temp>testvbox
StdOut: ""

推荐阅读