登录
首页 >  Golang >  Go问答

双引号导致 Golang 在 Windows 上执行 exec.Command 失败

来源:stackoverflow

时间:2024-03-18 16:48:29 112浏览 收藏

在 Windows 上使用 Go 语言的 `exec.Command` 执行命令时,双引号可能会导致错误。当命令包含多个子命令(例如使用 `&` 运算符)时,双引号会引起语法问题。因此,为了避免此问题,建议将命令拆分为单独的子命令,每个子命令使用自己的 `exec.Command` 实例。

问题内容

我有这个评论,它下载一个简单的文件:

var tarMode = "xf"
cmdEnsure = *exec.Command("cmd", "/C", fmt.Sprintf(`curl -L -o file.zip "https://drive.google.com/uc?export=download&id=theIDofthefile" && tar -%s file.zip`, tarMode))
err := cmdEnsure.Run()

这段代码在go中会出错,因为: curl:(1) libcurl 中不支持或禁用协议“”https”。

现在我明白这是由于我的双引号而发生的。但是,如果我删除 if,我会得到 id 无法识别为内部或外部命令、可操作程序或批处理文件 ,这是有道理的,因为 & 简单意味着在 cmd 中执行另一个命令。

那么我执行此类下载命令和提取的选项是什么。 该命令本身在 cmd 上运行良好。


正确答案


我发现最好不要尝试在一次执行中组合多个命令。下面的代码工作得很好,你不必担心转义和可移植性,你还可以获得更好的错误处理。

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    if b, err := exec.Command("curl", "-L", "-o", "file.zip", "https://drive.google.com/uc?export=download&id=theIDofthefile").CombinedOutput(); err != nil {
        fmt.Printf("%+v, %v", string(b), err)
        return
    }

    if b, err := exec.Command("tar", "-x", "-f", "file.zip").CombinedOutput(); err != nil {
        fmt.Printf("%+v, %v", string(b), err)
    }
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>