Выполнение пакетного файла из java возвращает null в качестве результата

#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