由于双引号,Windows 上的 Golang exec.Command 错误
Golang exec.Command error on Windows due to double quote
我有这个评论,它下载了一个简单的文件:
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) Protocol ""https" not supported or disabled in libcurl
.
现在我明白这是由于我的双引号引起的。但是,如果我删除 if,我会得到 Id is not recognized as an internal or external command, operable program or batch file
,这是有道理的,因为 &
简单意味着在 cmd
.
中执行另一个命令
那么我执行此类下载命令和提取的选项是什么。
命令本身 运行 在 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)
}
}
我有这个评论,它下载了一个简单的文件:
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) Protocol ""https" not supported or disabled in libcurl
.
现在我明白这是由于我的双引号引起的。但是,如果我删除 if,我会得到 Id is not recognized as an internal or external command, operable program or batch file
,这是有道理的,因为 &
简单意味着在 cmd
.
那么我执行此类下载命令和提取的选项是什么。
命令本身 运行 在 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)
}
}