如何将Java文件中的变量传递给batch批处理文件?
批处理变量更新方案汇总
方案1:位置参数传递(现有逻辑的优化版)
你当前的代码没有给批处理传递参数,直接在ProcessBuilder的命令列表里追加参数即可,是最轻量化的传参方案:
修正后的Java代码
public static void main(String[] args) throws InterruptedException, IOException { // 自定义两个参数的取值 String rootFolder = "C:\\your\\root\\path"; String fileName = "custom_log_name"; // 把参数直接追加到命令末尾,对应批处理的%1、%2 ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "logs.bat", rootFolder, fileName); File dir = new File("C:\\WORKPLACE\\NavSDK\\Prometheus\\Automation\\promta\\src\\test\\resources"); pb.directory(dir); Process p = pb.start(); // 注意:你当前代码执行完bat启动后立刻杀adb,会导致logcat还没开始就被终止,建议调整kill时机到需要停止录日志的时候 // Runtime rt = Runtime.getRuntime(); // rt.exec("taskkill /F /IM adb.exe /T"); }
注意:你原有代码中启动批处理后立刻执行adb杀死命令,会导致logcat命令刚启动就被终止,需要把杀死逻辑调整到你需要停止日志采集的时机。
方案2:系统环境变量传递
适合参数较多、不想按位置传参的场景,通过ProcessBuilder的环境变量配置给子进程传入变量,批处理直接读取对应环境变量即可:
调整后的批处理代码
@echo off set rootFolder=%CUSTOM_ROOT_FOLDER% set logFolder_Dir=logs set outputLogsFolder_LocalDir=%rootFolder%\%logFolder_Dir% set filename=%CUSTOM_FILE_NAME% adb shell setprop persist.log.tag V adb logcat com.harman.prometheusnav > %filename%.txt pause
对应的Java代码
public static void main(String[] args) throws InterruptedException, IOException { ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "logs.bat"); File dir = new File("C:\\WORKPLACE\\NavSDK\\Prometheus\\Automation\\promta\\src\\test\\resources"); pb.directory(dir); // 往子进程的环境变量里写入自定义参数 pb.environment().put("CUSTOM_ROOT_FOLDER", "C:\\your\\root\\path"); pb.environment().put("CUSTOM_FILE_NAME", "custom_log_name"); Process p = pb.start(); }
方案3:动态生成批处理文件
适合需要固定参数值、不需要每次传参的场景,Java代码直接把变量值写入到临时bat文件中,再执行该临时文件:
public static void main(String[] args) throws IOException { String rootFolder = "C:\\your\\root\\path"; String fileName = "custom_log_name"; // 拼接批处理完整内容 String batContent = "@echo off \n" + "set rootFolder=" + rootFolder + "\n" + "set logFolder_Dir=logs\n" + "set outputLogsFolder_LocalDir=%rootFolder%\\%logFolder_Dir%\n" + "set filename=" + fileName + "\n" + "adb shell setprop persist.log.tag V\n" + "adb logcat com.harman.prometheusnav > %filename%.txt\n" + "pause"; // 写入临时bat文件 File tempBat = new File("C:\\temp\\temp_logs.bat"); FileWriter writer = new FileWriter(tempBat); writer.write(batContent); writer.close(); // 执行临时bat ProcessBuilder pb = new ProcessBuilder("cmd", "/c", tempBat.getAbsolutePath()); pb.start(); }
方案4:配置文件中转
适合多脚本共用参数、需要参数持久化的场景,Java先把参数写入到配置文件,批处理读取配置文件取值即可。
内容的提问来源于stack exchange,提问作者chumki
相关产品推荐
相关产品推荐

