Java и многострочные пакетные файлы - PullRequest
1 голос
/ 27 февраля 2011

Я пытаюсь запустить командный файл в Java, но файл выполняется не полностью.Код выглядит так:

Runtime.getRuntime().exec("cmd /c call "+path);

Когда я пытаюсь запустить его вручную, без Java, пакетный файл работает правильно.

Пакетный файл содержит следующий код:

cd C:\Downloads\
if not exist Documents mkdir Documents
move *.odt Documents
move *.doc Documents
if not exist Archives mkdir Archives
move *.tar Archives
move *.gz Archives
if not exist Music mkdir Music
move *.mp3 Music

Javaполная партия только до пятой строки.Кто-нибудь сталкивался с этим?


Хм, с партия , он снова остановился здесь .И Java-код: ссылка .Если добавить в somename.ogg в папку загрузок, скрипт перейдет к следующей строке.Все папки (Архивы, Документы и т. Д.) Уже существуют, и папка для скачивания не содержит файлов * .zip, * .tar, * .docx, * pdf, но эти строки прошли без проблем.Почему остановился именно на ogg-line?

Ответы [ 4 ]

1 голос
/ 27 февраля 2011

Мне кажется, проблема в том, что в вашем пакетном скрипте есть ошибка. Документация MSDN для команды if гласит:

Вы не можете использовать команду if для непосредственного тестирования каталога, но нулевое (NUL) устройство существует в каждом каталоге. В результате вы можете проверить нулевое устройство, чтобы определить, существует ли каталог. В следующем примере проверяется наличие каталога:

if exist c:\mydir\nul goto process

Теперь способ его использования (if not exist directory mkdir directory), скорее всего, будет успешным, если каталог не существует ... но попытайтесь создать каталог во второй раз, если он существует. Упс ...


Теперь, когда ваше Java-приложение прочитало и распечатало содержимое потока ошибок для процесса, вы, скорее всего, увидите сообщение об ошибке, сообщающее, что каталог Archives уже существует. Игнорирование вывода вызывает проблемы, ИМО.

0 голосов
/ 27 февраля 2011

Если вы не осторожны с потоками stdout и stderr, очень легко заблокировать ProcessBuilder или Runtime.exec (). Статья When Runtime.exec() won't на JavaWorld содержит много полезной информации об этой и нескольких других подводных камнях.

Если возможно, я бы предложил использовать Commons Exec , потому что вся необходимая перекачка потока сделана для вас.

0 голосов
/ 27 февраля 2011

Боже мой, ребята!

Я не понимаю почему, но:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call", "\"" + "sort.bat" + "\""); 
builder.start();

не работает, НО:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "call", "\"" + "sort.bat" + "\""); 
BufferedReader br = new BufferedReader(new InputStreamReader(builder.start().getInputStream()));
String line;
while ((line=br.readLine())!=null) {
    System.out.println(line);
}

работает правильно! %)

Если кто-то понимает это, пожалуйста, объясните это.

0 голосов
/ 27 февраля 2011

Могу поспорить, path в вашей Java-программе содержит пробелы или что-то подобное. Вы цитируете это правильно?

Кстати: Runtime.exec () заменен ProcessBuilder, который может обрабатывать аргументы намного лучше, чем Runtime.exec ()

Попробуйте это:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c",  "call \"" + path "\""); 
builder.start();
...