执行包含空格的文件夹中包含的cmd文件

时间:2013-08-16 12:08:29

标签: java cmd

我正在尝试使用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中,即它的名称中没有空格的文件夹,它可以正常工作。

有人可以帮忙吗?

3 个答案:

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