Vboxmange命令产生新窗口-已通过go os.exec测试运行-为什么-如何解决?

时间:2018-08-03 15:42:01

标签: virtualbox

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

使用以下测试执行代码运行vboxmange命令,它将生成一个新窗口,因此stdout为空;

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标签)

EDIT3:

我已经与Docker和Oracle一起开了票,但我希望不大...

1 个答案:

答案 0 :(得分:0)

该问题似乎是环境问题,而不是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,但如果您检查的是文件则不是描述为“ 用于Windows启动器的BeyondTrust PowerBroker ”。

有一个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: ""