我正在尝试使用JDK7u25运行cmd文件,代码如下:
try {
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.directory(workingDir);
proc = pb.start();
} catch (IOException e) {
System.out.println(e.getMessage());
throw e;
}
// StdOut and Err Stream must be read immediatly even if they are not used
// any error message?
StreamInlet error = new StreamInlet(proc.getErrorStream(), "ERROR");
// any output?
StreamInlet output = new StreamInlet(proc.getInputStream(), "OUTPUT");
// kick them off
error.start();
output.start();
if (wait) {
try {
exitCode = proc.waitFor();
} catch (InterruptedException e) {
System.out.println("Waiting for process was interrupted");
}
if (addMetaInfo)
System.out.println("Return value = " + exitCode);
}
其中cmd=[cmd.exe, /c, C:\My Root\scripts\windows\tools\MyCLI.cmd, -c, C:\Local Disk D\My Tutorial\RegressionTests.xml, -d, 02_RecordViewer_Test, -l"ERROR"]
但它不起作用,我得到了输出。
'C:\ My'不被识别为内部或外部命令,
可操作程序或批处理文件。
我已经通过在调用cmd文件之前添加显式“CMD.EXE / C”对JDK7U21 issue进行了必要的更改。我也在使用ProcessBuilder类,如JDK7u21问题中所述。
如果我尝试执行的cmd文件放在C:\ MyRoot中,即它的名称中没有空格的文件夹,它可以正常工作。
有人可以帮忙吗?
答案 0 :(得分:3)
您需要将路径用cmd
所需的引号括起来:
String[] cmd = {"cmd.exe", "/c", "\"C:\\My Root\\scripts\\windows\\tools\\MyCLI.cmd\"", "-c", "\"C:\\Local Disk D\\My Tutorial\\RegressionTests.xml\"",.....};
正如我们通过聊天讨论的那样 更新,问题似乎是ProcessBuilder
将参数传递给cmd.exe
。但是,由于您拥有可执行文件的完整路径,因此根本不需要cmd.exe
。所以命令看起来像这样:
String[] cmd = {"\"C:\\My Root\\scripts\\windows\\tools\\MyCLI.cmd\"", "-c", "\"C:\\Local Disk D\\My Tutorial\\RegressionTests.xml\"",.....};
答案 1 :(得分:1)
我刚刚注意到JDK7u25已经解决了这个问题。我刚刚发现它是Release Notes。
答案 2 :(得分:0)
我很想将反斜杠更改为正斜杠,然后逃避空格。
C:/My\ Root/scripts/windows/tools/MyCLI.cmd