Processing执行bat脚本工作目录错误找不到Exe2.exe问题咨询
问题描述
- 现有逻辑:Processing程序调用存放在sketch路径下
lib子文件夹内的open.bat,该bat与Exe2.exe同目录,bat逻辑为启动Exe2.exe后循环检测同目录下answer.txt是否生成,读取文件内容后删除文件,继续循环检测。直接手动双击bat文件可以正常运行。 - 异常表现:使用原有Processing代码调用bat时,弹出
Windows cannot find Exe2.exe错误,控制台显示命令执行起始路径为Processing的安装目录,与bat所在目录不匹配。 - 原有错误调用代码:
try { p1 = r.exec("cmd /c start " + Path + "/open.bat"); } catch(Exception c) { }
- 原有
open.bat内容:
start Exe2.exe cls @ECHO OFF SET LookForFile="answer.txt" :CheckForFile IF EXIST %LookForFile% GOTO FoundIt GOTO CheckForFile :FoundIt echo the number is: more answer.txt del "answer.txt" GOTO CheckForFile
- 复现问题的简易Sketch代码:
String Path; Runtime r = Runtime.getRuntime(); Process p1; void setup(){ Path = sketchPath()+"/lib"; try { p1 = r.exec("cmd /c start " + Path + "/open.bat"); } catch(Exception c) { } }
- 需求:不硬编码绝对路径,保证程序在不同设备上都能正常调用bat、启动Exe2.exe。
根因分析
Runtime.exec()执行系统命令时,默认继承当前Java进程(即Processing运行环境)的工作目录,也就是Processing的安装目录,不会自动切换到bat文件所在的目录。bat内写的相对路径Exe2.exe会从进程工作目录下查找,自然找不到对应文件,触发报错。
解决方法
两种方案任选其一即可,都不需要硬编码绝对路径,支持跨设备运行。
方案1:修改Processing调用代码,指定进程工作目录(推荐,无需改动原有bat脚本)
使用Runtime.exec的重载方法,第三个参数传入进程的工作目录,直接指定为bat所在的lib文件夹即可,bat内的所有相对路径都会以该目录为基准查找。
修改后的Sketch代码:
import java.io.File; Runtime r = Runtime.getRuntime(); Process p1; void setup(){ File libDir = new File(sketchPath(), "lib"); File batFile = new File(libDir, "open.bat"); try { // 传参时用数组形式避免路径含空格导致的转义问题,指定工作目录为libDir p1 = r.exec( new String[]{"cmd", "/c", "start", batFile.getAbsolutePath()}, null, libDir ); } catch(Exception e) { e.printStackTrace(); } }
注意:不要留空的catch块,加上异常打印方便后续排查问题。
方案2:修改bat脚本,启动时自动切换到自身所在目录
如果不方便修改Processing调用逻辑,可以直接改bat文件,在开头加一行命令,让bat执行时先切换到自己所在的目录,后续所有相对路径都会从该目录查找。
修改后的open.bat内容:
@ECHO OFF :: 切换到当前bat文件所在的目录,支持跨盘符 cd /d "%~dp0" start Exe2.exe cls SET LookForFile="answer.txt" :CheckForFile IF EXIST %LookForFile% GOTO FoundIt :: 增加1秒等待避免空循环占满CPU timeout /t 1 /nobreak >nul GOTO CheckForFile :FoundIt echo the number is: more answer.txt del "answer.txt" GOTO CheckForFile
内容的提问来源于stack exchange,提问作者FinalBos5
相关产品推荐
相关产品推荐

