Java 使用双引号执行cmd脚本

Java 使用双引号执行cmd脚本,java,Java,我试图用多个参数执行一个过程,但它们有双引号“…” 以下是我构建脚本的方式: public void capture(String from, String to, String outputFile) 此方法将运行该命令,它采用以下3个参数: 捕获(“0”、“100”、“C:\\Program Files\\myProgram\\file.txt”) 因此,完整构建的命令如下所示: String command = "\"C:\\Program Files (x86)\\otherProg\

我试图用多个参数执行一个
过程
,但它们有双引号
“…”

以下是我构建脚本的方式:

public void capture(String from, String to, String outputFile)
此方法将运行该命令,它采用以下3个参数:

捕获(“0”、“100”、“C:\\Program Files\\myProgram\\file.txt”)

因此,完整构建的命令如下所示:

String command = "\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis "
    + from + " " + to + " \"" + outputFile + "\"";
String[] script = {"cmd.exe", "/c", command};
Process p = Runtime.getRuntime().exec(script);
Process p = Runtime.getRuntime().exec(
    "\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis 0 100 \"C:\\Program Files\\myProgram\\file.txt\"");
为了清楚地看到它,这是命令的可视输出:

“C:\Program Files(x86)\otherProg\prog.exe”/dothis 0 100“C:\Program Files\myProgram\file.txt”

好的,然后我像这样执行它:

String command = "\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis "
    + from + " " + to + " \"" + outputFile + "\"";
String[] script = {"cmd.exe", "/c", command};
Process p = Runtime.getRuntime().exec(script);
Process p = Runtime.getRuntime().exec(
    "\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis 0 100 \"C:\\Program Files\\myProgram\\file.txt\"");
在这一点上什么也没有发生。
命令不会执行,但是如果我获取输出:

“C:\Program Files(x86)\otherProg\prog.exe”/dothis 0 100“C:\Program Files\myProgram\file.txt”

复制粘贴到CMD中,命令不会执行(我会得到预期的输出)

我尝试过像这样构建命令,但同样的效果也发生了。
运行该命令的唯一可能方法是如下操作:

“C:\Program Files(x86)\otherProg\prog.exe”/dothis 0 100 C:\Folder\myProgram\file.txt

没有最后一个参数的引号,当然,路线中也没有空格

解决方法是什么?

更新1:
还尝试了
script=script.replace(“\n”和“”).replace(“\t”和“”)
,两者都不起作用

更新2:
刚刚尝试过这样构建流程:

String command = "\"C:\\Program Files (x86)\\otherProg\\prog.exe\" /dothis "
    + from + " " + to + " \"" + outputFile + "\"";
String[] script = {"cmd.exe", "/c", command};
Process p = Runtime.getRuntime().exec(script);
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+"\"";    

&
它能工作吗

我发布这篇文章主要是为了提供信息。考虑下面的代码:

Process p = Runtime.getRuntime().exec("cmd /c start cmd.exe echo Hello World");
这确实会导致命令提示符出现在my home(默认)目录中,但实际上不会执行
echo
命令。事实上,以下几点也会起到同样的作用:

Process p = Runtime.getRuntime().exec("cmd /c start cmd.exe blah blah blah");
因此,Java似乎忽略了
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不允许它从第一个进程启动第二个进程。

尝试使用process builder和/或分离参数

过程生成器

ProcessBuilder pb = new ProcessBuilder("\"C:\\Program Files (x86)\\otherProg\\prog.exe\"", "/dothis ", "from + " " + to + " \"" + outputFile + "\"");
Process p = pb.start();
运行时

Runtime.getRuntime().exec(new String[]{"\"C:\\Program Files (x86)\\otherProg\\prog.exe\"", "/dothis ", "from + " " + to + " \"" + outputFile + "\""});

谢谢,由于你的推荐,解决了它,即使它不是解决方案本身,我将它标记为解决方案,帮助很大。为了阐明这一点,我觉得你试图1)启动一个命令提示符,然后2)从你的Java程序在提示符内运行一个命令,这是不可能的。@TimBiegeleisen,如何运行.exe之后的东西?