使用双引号执行cmd脚本

时间:2016-01-20 08:30:41

标签: java

我尝试使用多个参数执行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+"\"";    

&是否有效。

2 个答案:

答案 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