Java执行批处理文件返回空结果,如何获取Echo输出值?
如何从Java获取批处理脚本的Echo输出?
问题出在你Java代码里的start命令上!当你用start运行批处理时,它会启动一个全新的CMD窗口来执行脚本,而你的Java程序只能捕获最初那个cmd.exe进程的输出——新窗口的输出根本不会传递到原来的进程里,所以你才会拿到空的结果,哪怕脚本实际已经正确输出了内容。
解决方案1:去掉start直接执行批处理
修改Java中exec的参数,删掉多余的start:
String filePath = "1234"; StringBuilder scriptOutputResult = new StringBuilder(); Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "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()); }
cmd /c本身就会负责执行后面的批处理脚本,不需要额外用start新开窗口。
更推荐的方案:使用ProcessBuilder并合并错误流
Runtime.exec比较老旧,ProcessBuilder提供了更灵活的配置,还能把错误输出和标准输出合并,避免因为错误流未读取导致进程阻塞的问题:
String filePath = "1234"; StringBuilder scriptOutputResult = new StringBuilder(); // 构建进程参数 ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "C:\\Thread\\Value\\xyz.bat", filePath); // 把错误输出重定向到标准输出,这样只用读一个流就够了 pb.redirectErrorStream(true); Process process = pb.start(); // 读取输出 try (BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()))) { log.info("Reading the output of shell script"); String line; while ((line = stdInput.readLine()) != null) { scriptOutputResult.append(line).append("\n"); } } // 等待进程结束并获取退出码 int exitCode = process.waitFor(); log.info("Command returned exit code = {}", exitCode); log.info("Output from the script executed is :{}", scriptOutputResult.toString());
关于你的批处理脚本
你的xyz.bat本身没有问题,它能正确接收参数并输出内容。只要Java端正确传递参数(现在的写法已经做到了),修改后就能捕获到ECHO的输出。
额外注意事项
- 确保批处理文件的路径绝对正确,如果路径包含空格或特殊字符,记得用引号把路径包起来,比如
"C:\\Thread My Folder\\Value\\xyz.bat" - 不要忽略错误流:如果脚本有错误输出(比如
Missing File Path),如果不读取错误流,可能会导致进程挂起,waitFor()永远不返回,redirectErrorStream(true)能解决这个问题
内容的提问来源于stack exchange,提问作者Bhanu
相关产品推荐
相关产品推荐

