我尝试使用多个参数执行Process
,但它们有双引号"..."
。
这是我构建脚本的方式:
public void capture(String from, String to, String outputFile)
此方法将运行命令,它采用此处给出的3个参数:
capture("0", "100", "C:\\Program Files\\myProgram\\file.txt")
所以完整构建的命令如下所示:
String command = "\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis "
+ from + " " + to + " \"" + outputFile + "\"";
要清楚地看到它,这是命令的视觉输出:
"C:\Program Files (x86)\otherProg\prog.exe" /dothis 0 100 "C:\Program Files\myProgram\file.txt"
好的,然后我执行它:
String[] script = {"cmd.exe", "/c", command};
Process p = Runtime.getRuntime().exec(script);
此时没有任何事情发生 命令没有执行,然而如果我接受输出:
"C:\Program Files (x86)\otherProg\prog.exe" /dothis 0 100 "C:\Program Files\myProgram\file.txt"
将它复制粘贴到CMD命令 DOES 执行(我得到预期的输出)。
我尝试过构建像this这样的命令,但会发生同样的效果 运行该命令的唯一可能方法是这样做:
"C:\Program Files (x86)\otherProg\prog.exe" /dothis 0 100 C:\Folder\myProgram\file.txt
在最后一个参数上没有引号,当然,路线中没有空格。
解决方法是什么?
更新1:
还尝试了script = script.replace("\n","").replace("\t","")
,但都没有效果。
更新2:
刚尝试建立这样的过程:
Process p = Runtime.getRuntime().exec(
"\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis 0 100 \"C:\\Program Files\\myProgram\\file.txt\"");
直接将转义命令传递给 进程,但为什么当它们是参数并用它们构建字符串时它不起作用?
感谢下面的Tim Biegeleisen
正如他所提到的,java存在一个问题,即命令和参数之间的区别以及何时运行多个命令,要解决此问题,请执行下一步:
String command = "cd \"C:\\Program Files (x86)\\otherProgram\\\" & program.exe /capture "+from+" "+to+" \""+outputFile+"\"";
&
是否有效。
答案 0 :(得分:4)
我发布此信息主要是为了提供信息。请考虑以下代码:
Process p = Runtime.getRuntime().exec("cmd /c start cmd.exe echo Hello World");
这确实会导致命令提示符出现在我的home(默认)目录中,但它实际上不会执行echo
命令。事实上,以下内容也是如此:
Process p = Runtime.getRuntime().exec("cmd /c start cmd.exe blah blah blah");
因此,似乎Java忽略了在<{em> cmd.exe
之后的所有内容。我对此的解释是实际命令为start
,该命令的参数为cmd.exe
。换句话说,一旦Java启动了命令提示符,它就已经使用了参数,其他一切都被忽略了。
这一观察结果与您的研究结果一致,即以下工作:
Process p = Runtime.getRuntime().exec(
"\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis 0 100 \"C:\\Program Files\\myProgram\\file.txt\"");
在这种情况下,命令是prog.exe
,后面的内容是参数。但是,如果您尝试将命令传递到命令提示符并从那里运行,那么它将无法工作。
因此,似乎使用Runtime.getRuntime().exec()
允许您从Java执行一个进程,但不能执行其中两个进程。这是有道理的,因为Java可以执行一个进程,但API不允许它从第一个进程启动第二个进程。
答案 1 :(得分:1)
尝试使用流程构建器和/或分离您的参数
Process Builder
Runtime.getRuntime().exec(new String[]{"\"C:\\Program Files (x86)\\otherProg\\prog.exe\"", "/dothis ", "from + " " + to + " \"" + outputFile + "\""});
运行
OkHttpClient