Как запустить bat-файл из java с аргументами (т.е. имя файла с полным путем), имеющим имя папки с пробелом - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь выполнить файл bat с некоторыми аргументами через программы JAVA.аргументы - это имя файла с полным путем, и этот путь имел некоторое имя папки с пробелом, что создает проблему и вызывает следующую ошибку

Ошибка: «D: \ Documents» не распознается каквнутренняя или внешняя команда

код как показано ниже

String command = "D:\Documents and Settings\ A.bat" + " " D:\Documents and Settings\B.xml



 1. process = Runtime.getRuntime().exec(new String[] {"cmd.exe","/c",command});
 2. process.waitFor();
 3. exitValue = process.exitValue();

Ответы [ 4 ]

3 голосов
/ 27 февраля 2012

Вам нужно экранировать \ в вашей строке (т.е. удваивать их: D:\\Documents), но это не проблема.Вы можете попытаться избежать пробелов Documents\\ and\\ Settings или использовать метод exec , который сделает это за вас.Просто не создавайте командную строку самостоятельно.Лучше использовать ProcessBuilder для запуска процессов.

0 голосов
/ 20 июня 2014

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

Я пытаюсь вызвать пакетный файл Windows из Java. Пакетный файл принимает несколько аргументов, но только первый, который является путем к файлу данных, имеет отношение к этой проблеме. Сокращенная командная строка, с которой я экспериментировал, по сути:

cmd /c c:\path\to\my\batchfile.bat c:\path\to\my\datafile.mdl

Я использую Apache Commons Exec, который в конечном итоге делегирует Runtime.getRuntime().exec(String[] cmdarray, String[] envp, File dir), «правильную» версию, в отличие от перегруженных версий, принимающих одну команду String. Таким образом, процитирование аргументов, когда они содержат пробелы, выполняется.

Теперь и путь к пакетному файлу, и / или путь к файлу данных могут содержать пробелы. Если или путь к пакетному файлу или путь к файлу данных содержат пробелы, то пакетный файл выполняется. Но если оба содержат пробелы, то путь к пакетному файлу усекается в первом пробеле.

Это должно быть (Java или Windows?) Ошибка, верно? Я отлаживал прямо до нативного вызова create() в java.lang.ProcessImpl, и все, кажется, в порядке. Я на JDK 1.6.

0 голосов
/ 07 июня 2012

Я пытался сделать то же самое. Я гуглил целый день, но не заставил его работать. Наконец я справился с этим таким образом, я делюсь этим, если речь идет о каком-либо использовании кого-либо:

        String command = "A.bat D:\\Documents and Settings\\B.xml";
        File commandDir = new File ( "D:\\Documents and Settings ");        
        String[] cmdArray = { "cmd.exe", "/c", command };


        1. Process process = Runtime.getRuntime().exec( cmdArray, null, cmdArray );
        2. process.waitFor();
        3. exitValue = process.exitValue();
0 голосов
/ 27 февраля 2012
String command = "\"D:\Documents and Settings\\" A.bat" + " \"D:\Documents and Settings\B.xml\""

Избегайте двойных кавычек, поэтому вы можете включить двойные кавычки в литерал, чтобы получить:

cmd.exe /x "D:\Documents and Settings\" A.bat "D:\Documents and Settings\B.xml"
...