Выполнение cmd файла, содержащегося в папке с пробелом

Я пытаюсь запустить файл cmd, используя JDK7u25 со следующим кодом:

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" не распознается как внутренняя или внешняя команда,

работоспособная программа или командный файл.

Я уже внес необходимые изменения в проблему JDK7U21, добавив явный "CMD.EXE /C" перед вызовом файла cmd. Также я использую класс ProcessBuilder, как упоминалось в выпуске JDK7u21.

Он прекрасно работает, если cmd-файл, который я пытаюсь выполнить, находится в C:\MyRoot, то есть в папке без пробела в его имени.

Может кто-нибудь, пожалуйста, помогите?

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\"",.....};

Я только что заметил, что эта проблема уже решена в JDK7u25. Я только что нашел его в примечаниях к выпуску.

Я бы соблазнился изменить обратную косую черту на прямую косую черту и избежать пробелов.

C:/My\ Root/scripts/windows/tools/MyCLI.cmd
Другие вопросы по тегам