Java调用执行bat文件成功但无法生成对应日志文件问题求助
问题排查结果
核心原因
- Java调用时使用了
start命令:start会启动独立的新cmd进程执行批处理,该进程的默认工作目录为Java程序的运行目录,而非bat文件所在的C:\Users\Ajay\Documents目录。你批处理中使用相对路径myLog.txt输出日志,因此日志实际生成在Java程序的工作目录下,而非bat同级目录,并非没有生成。 - 相对路径依赖问题:批处理未指定日志的绝对存储路径,完全依赖执行进程的工作目录,目录不匹配时就会出现找不到日志的情况。
修复方案
方案一:修改Java调用逻辑(推荐)
去掉start命令,同时指定批处理执行的工作目录为bat所在目录,Java也可以选择等待批处理执行完成再继续后续逻辑:
public static void allBatch() { try { // 第三个参数指定执行工作目录为bat所在路径 Process process =Runtime.getRuntime().exec("cmd /C batchFile.bat", null, new File("C:\\Users\\Ajay\\Documents")); // 可选:等待批处理执行完成,获取退出码 int exitCode = process.waitFor(); System.out.println("执行完成,退出码:" + exitCode); } catch (IOException | InterruptedException ex) { ex.printStackTrace(); } }
如果必须要使用start新开窗口执行,可以给start指定工作目录参数:
Process process =Runtime.getRuntime().exec("cmd /C start /d \"C:\\Users\\Ajay\\Documents\" batchFile.bat");
方案二:修改批处理日志路径(无需改Java代码)
直接将批处理中的日志输出路径改为绝对路径,无论执行进程的工作目录是什么,日志都会生成到指定位置:
@echo off :: 改为绝对路径输出日志 call :main >C:\Users\Ajay\Documents\myLog.txt 2>&1 :main if exist "C:\Users\Ajay\Documents\old Tomcat\Controller\*.*" ( xcopy /e "C:\Users\Ajay\Documents\old Tomcat\Controller\*.*" "C:\Users\Ajay\Documents\newTomcat\Controller\*" /y echo %date%-----Copy Successful------%time% echo --------------------------------------------------- net stop Tomcat8 sc query Tomcat8 echo %date%-----Stop Successful------%time% rem start notepad "C:\Users\Ajay\Documents\" )else echo %date%------- sorry Failed TO Copy -----%time% timeout 5 > nul exit
内容的提问来源于stack exchange,提问作者340- Surwade Ajay Mukund
相关产品推荐
相关产品推荐

