#java #command-prompt
#java #командная строка
Вопрос:
когда я запускаю эту команду ffmpeg -i "C:usertest.wmv" >C:usertest.wmv_info.txt 2>amp;1
из командной строки, она работает, но когда я пытаюсь сделать то же самое из файла java, вызывая командную строку, она выполняется нормально, но не записывается в файл.
Есть идеи, почему?
мой java-код таков:
public void getInfoThroughCommandLine(String sourceFilePath) {
try {
String infoFile = sourceFilePath "_info.txt";
String command = "ffmpeg -i ""
sourceFilePath "" >" infoFile " 2>amp;1";
// Execute the command
Process process = Runtime.getRuntime().exec("cmd.exe /c start " command);
logger.info("Executing getInfoThroughCommandLine command: " command);
// Read the response
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
BufferedReader error = new BufferedReader(new InputStreamReader(
p.getErrorStream()));
// Parse the input stream
String line = input.readLine();
System.out.println("ffmpeg execution of: " sourceFilePath);
while (line != null) {
System.out.println("t***" line);
line = input.readLine();
}
// Parse the error stream
line = error.readLine();
System.out.println("Error Stream: " sourceFilePath);
while (line != null) {
//do somthing
}
} catch (Exception e) {
System.err.println(e);
}
}
Комментарии:
1. Дайте нам какой-нибудь код, пожалуйста. Причин может быть миллион …
2. Покажите нам свою строку кода Java, которая пытается сделать то же самое.
Ответ №1:
Я полагаю, вы используете getRuntime().exec()
для выполнения?
Если это так Process
, то возвращаемый им объект будет тем, который дает вам доступ к входящим / исходящим потокам выполняемой вами команды. Просто прочитайте из него и напишите свой собственный файл.
— редактировать на основе обсуждения с помощью комментариев —
запуск в "cmd.exe /c start " command
запустил бы программу в отдельном окне, и я предполагаю, что потоки процесса подключены к этому окну.
C:Usersz000dgqd>start /?
Starts a separate window to run a specified program or command.
........
Попробуйте удалить его. Т.е.
// Change this:
Process process = Runtime.getRuntime().exec("cmd.exe /c start " command);
// to this
Process process = Runtime.getRuntime().exec("cmd.exe /c " command);
Комментарии:
1. я не могу этого сделать, так как мое приглашение cmd закрывается сразу после выполнения команды. Вероятно, я мог бы это сделать, если cmd остается открытым.
2. Поток будет иметь данные до тех пор, пока вы не прочитаете (или не удалите / не закроете) их. Пример в Google, попробуйте, а затем вернитесь, если у вас возникнут проблемы.
3. Я делаю это, и он возвращает пустую строку —
4. Что возвращает пустую строку? Опубликуйте код. Я надеюсь, что вы удалили перенаправление из команды.
5. о .. я не удалил перенаправление.. позвольте мне сделать это и посмотреть
Ответ №2:
>
2>amp;1
И — это операторы оболочки, которые сообщают оболочке перенаправить вывод вашей команды ( ffmpeg -i "C:usertest.wmv"
) в определенный файл ( C:usertest.wmv_info.txt
).
Эти операторы не работают в Java, в Java вы должны явно использовать стандартный вывод и стандартную ошибку (через Process#getInputStream() и Process#getErrorStream () соответственно — я знаю, что это кажется обратным) и записать выходные данные этих потоков в файл самостоятельно.
Комментарии:
1. 1: Оболочка — это больше, чем просто консольная версия запуска… запрос. Это больше, чем просто передача аргументов в исполняемые файлы.
Ответ №3:
Перенаправление обрабатывается командной оболочкой, то есть с помощью CMD.EXE
— и если вы просто вводите строку выше Runtime.exec()
, это не будет сделано. Вы можете либо организовать отправку этой командной строки CMD.EXE
, что сложно сделать правильно, либо вы можете выполнить перенаправление самостоятельно на Java, прочитав выходные данные процесса и потоки ошибок и сохранив данные в файл.
Комментарии:
1. Я могу заставить эту командную строку перейти к cmd.exe . Он также вызывает команду, но просто не может выполнить запись в файл. Он даже создает файл.
2. Ваш код записывает вывод CMD.EXE к файлу, а не к выходным данным программы. Удалите CMD.EXE /c и просто запустите программу напрямую, затем оставьте запись потока включенной.
Ответ №4:
Может быть, вы могли бы записать эту команду в файл .bat и запустить его? Не самое чистое решение, но оно может сработать.