#java #batch-file #return-value #execution
#java #пакетный файл #возвращаемое значение #выполнение
Вопрос:
У меня есть файл bat для выполнения из java и сохранения выходного результата в переменной java. Скрипт работает нормально при запуске из cmd и также выполняется из java, и я получаю значение exit в java, но не могу получить возвращаемое значение echo. Ниже приведен код Java, который я использую, а также сценарий bat.
Код Java
String filePath = "1234";
StringBuilder scriptOutputResult = new StringBuilder();
Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "start C:\Thread\Value\xyz.bat", filePath});
exitCode = process.waitFor();
log.info("Command returned exit code = {}", exitCode);
try (BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
log.info("Reading the output of shell script");
String line = null;
while ((line = stdInput.readLine()) != null) {
scriptOutputResult.append(line).append("n");
}
log.info("Output from the script executed is :{}", scriptOutputResult.toString());
}
Output.log
Command returned exit code = 0
Output from the script executed is :
xyz.bat
@ECHO OFF
SET filePath=%1
ECHO %filePath%
IF "%filePath%" == "" (
ECHO Missing File Path
EXIT /B 1
GOTO :eof
) ELSE (
ECHO %filePath%
EXIT /B 0
GOTO :eof
)
Пожалуйста, дайте мне знать, если я что-то упустил в пакетном файле или любым другим способом получить вывод файла в java каким-либо другим способом.
Комментарии:
1. Какой смысл использовать
start
для запуска пакетного файла?start
без/WAIT
этого, ну, не ждать завершения скрипта, поэтому вы никогда не сможете захватить его код выхода…2. Правильно, если я удалю start из приведенного выше массива, он будет работать и также вернет значение echo.
Ответ №1:
Вам нужно фиксировать стандартный вывод процесса во время его выполнения, а не после. Поэтому вместо
exitcode = process.waitFor()
вам нужно проверить, завершился ли процесс. Если нет, прочитайте все данные из его потоков stdout и stderr. Этот цикл будет держать вас в напряжении.
После завершения процесса у вас есть код выхода и выходные данные процесса.
Примечание: В Windows особенно важно время от времени очищать буферы, иначе процесс застрянет. См. https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Process.html