我在Go中做了一个小小的黑客,因为我需要使用动态标志运行第三方可执行文件(这取决于服务器设置和一些硬件规格,每台机器上每次都不同)。
我正在使用一些简洁的库来帮助我找出Go可执行文件所在的路径。第三方二进制文件与Go one相同。
path, err := osext.ExecutableFolder()
if err != nil {
log.Fatal(err)
}
path += "3rdparty.exe"
我运行fmt的Sprintf
方法,将路径和标志放入名为Command的单个字符串中。
我试着像这样调用它:
out, err := exec.Command(Command).Output()
if err != nil {
fmt.Println("Command execution failed:", err)
}
然而,错误不是零。我无法复制vmware的错误(设置窗口只是为了编译和测试),但它是这样的:
Command execution failed: "C:\\PATH\\TO\\3rdparty.exe --flags-omitted" file does not exist
然而,当我将C:\\PATH\\TO\\3rdparty.exe --flags-omitted
复制到cmd时,它运行得很好。
有什么想法吗?
答案 0 :(得分:5)
该命令及其参数必须是单独的字符串,不要将它们连接成一个字符串。
仔细看看,实际的错误消息是清除它(注意引号所在的位置):
Command execution failed: "C:\\PATH\\TO\\3rdparty.exe --flags-omitted" file does not exist