Golang调用Windows cmd执行含双引号命令报错问题求助
问题解决:Windows下Go执行带双引号的CMD命令出错
问题原因
Windows的cmd.exe在处理通过exec.Command传递的带引号命令时,默认的/c参数会错误解析命令中的双引号结构。当你将完整命令作为单个参数传给cmd /c时,cmd.exe会对参数进行二次解析,内部的双引号会被当作语法分隔符而非命令的一部分,从而抛出“文件名、目录名或卷标语法不正确”的错误。
解决方案
修改exec.Command的调用方式,添加/s参数并将整个命令用双引号包裹,让cmd.exe正确识别命令内部的引号结构。
修改后的核心代码
将原代码中的:
cmd := exec.Command("cmd", "/c", command)
替换为:
cmd := exec.Command("cmd", "/s", "/c", fmt.Sprintf(`"%s"`, command))
完整修改后的代码
package main import ( "bufio" "fmt" "os" "os/exec" ) type customOutput struct{} func (c customOutput) Write(p []byte) (int, error) { fmt.Println("received output: ", string(p)) return len(p), nil } func main() { fmt.Print("> ") scanner := bufio.NewScanner(os.Stdin) scanner.Scan() command := scanner.Text() // 添加/s参数并包裹命令为双引号,确保cmd正确解析内部引号 cmd := exec.Command("cmd", "/s", "/c", fmt.Sprintf(`"%s"`, command)) cmd.Stdout = customOutput{} cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Println("could not run command: ", err) } }
原理说明
/s参数:告诉cmd.exe,后续/c后的参数是一个被双引号包裹的完整命令字符串,cmd会保留字符串内部的引号结构进行解析,而不会将内部引号视为语法分隔符。- 用双引号包裹命令字符串:确保
cmd.exe将整个输入作为单一命令处理,避免内部空格或引号导致的参数拆分错误。
内容的提问来源于stack exchange,提问作者Niu
相关产品推荐
相关产品推荐

