java runtime.exec cmd /c 解析引用参数

java runtime.exec cmd /c parsing quoted arguments

我正在尝试 运行 runtime.exec(String[],null, new File(directory)) 前两个参数是 "cmd" 和“/c”。

我正在尝试将 tomcat 的 java 版本指定为 运行。似乎 cmd /c 参数导致 runtime.exec 通过 space 描述来解析所有参数,或者更恰当地说 cmd 正在解析每个参数。

所以,

cmd /c .\bin\Tomcat7.exe //US//Tomcat7 --Jvm="C:\Program Files\Apache Tomcat 7\jre\bin\server\jvm.dll"

正在将 jvm 参数分解为参数 "C:\Program"、"Files\Apache"、"Tomcat..... 这导致无法解释参数。引用参数似乎也被忽略了。

有没有办法让 cmd 遵守引用 jvm 参数或利用 runtime.exec 中的指定目录?

感谢阅读。

一个有效的解决方法是使用 windows 简称:

Program Files替换为PROGRA~1(使用DIR /X C:\ | find "Program")看是否是正确的名字

Apache Tomcat 7替换为APACHE~1(或DIR /X C:\PROGRA~1 | find "Apache"返回的任何内容)

你的命令很可能是

cmd /c .\bin\Tomcat7.exe //US//Tomcat7 --Jvm=C:\PROGRA~1\APACHE~1\jre\bin\server\jvm.dll

没有更多空间:问题已解决

编辑:

未经验证,但您可能想试试这种 exec 风格:

public Process exec(String command, String[] envp, File dir);

像这样:

exec("cmd /c .\bin\Tomcat7.exe //US//Tomcat7 --Jvm=\"C:\Program Files\Apache Tomcat 7\jre\bin\server\jvm.dll\"",null,new File(directory))

您当前使用的 API 必须从您的参数重建完整的命令行,这些参数不是真正的参数,而是带有空格、引号等的参数组...这是可能的(未选中)API 试图在不需要的地方添加引号,从而破坏您的命令行。