从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ý
相关产品推荐
相关产品推荐

