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

从Groovy/Java调用外部进程返回意外结果:输出内容带多余双引号问题求助

解决cmd /c echo mytext执行后输出末尾多余双引号的问题

问题原因

你遇到的末尾多余双引号,根源在于ProcessBuilder的参数传递方式错误。在Windows系统中,cmd.exe对命令行参数的处理有特殊逻辑:当你把/c echo mytext作为单个参数传给cmd时,ProcessBuilder会自动给包含空格的参数加上双引号(变成"/c echo mytext"),而cmd在解析这个参数时,会错误地处理引号,最终导致输出末尾多了一个双引号。

你可以直接在Windows命令提示符里测试这个行为:输入cmd "/c echo mytext",输出结果就是mytext",和你代码里的现象完全一致。

解决方案

修改ProcessBuilder的参数,把/c和后续的命令拆分成两个独立的参数传递:

import java.nio.charset.Charset
println(Charset.defaultCharset().displayName()) // 返回windows-1250
// 控制台中chcp命令返回852
def pb = new ProcessBuilder("cmd", "/c", "echo mytext") // 拆分参数
def proc = pb.start()
def stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream(), "CP852"))
def stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "CP852"))
def line = null
println("Here is the standard output of: cmd /c echo mytext")
while ((line = stdInput.readLine()) != null) {
 println(line)
}
println("Here is the standard error of the command (if any):")
while ((line = stdError.readLine()) != null) {
 println(line)
}

这样修改后,cmd会正确解析参数:/c作为执行命令的选项,echo mytext作为要执行的命令,输出就会是正常的mytext,不会有多余的引号。

补充说明

如果你的命令是动态生成的(比如mytext是变量),同样需要保持/c为独立参数,后续命令作为另一个参数:

def myText = "Hello World"
def pb = new ProcessBuilder("cmd", "/c", "echo ${myText}")

这样就能避免任何引号解析的问题,确保命令执行结果符合预期。


内容的提问来源于stack exchange,提问作者David Hajný

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:37:46