You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:02:36