使用ProcessBuilder运行指定目录批处理及Python脚本的问题求助
解决ProcessBuilder执行批处理+Python脚本的问题
我看你现在的代码问题出在cmd命令的构造方式上——你把cd、批处理路径、Python命令直接用空格堆在一起,但cmd.exe /C只会把第一个空格后的完整字符串当作要执行的命令,后面的内容都会被当成参数传给第一个命令,自然没法按你想要的顺序完成所有步骤。
给你两种靠谱的解决办法,选哪个都行:
方法1:用命令连接符串起所有步骤
Windows的cmd里可以用&&(前一步执行成功才会执行下一步)或者&(不管前一步结果如何都执行)来连接多个命令。把你的所有操作整合成一个cmd能识别的完整字符串就行:
try { String[] command = { "cmd.exe", "/C", "cd C:\\Users\\vk\\Logs && C:\\Users\\Vk\\TestBatch.bat && C:\\Python27\\ArcGIS10.3\\python.exe C:\\Users\\vk\\TestScript2.py" }; ProcessBuilder probuilder = new ProcessBuilder(command); // 合并错误流和输出流,方便查看执行时的日志信息 probuilder.redirectErrorStream(true); Process process = probuilder.start(); // 等待命令全部执行完成 int exitCode = process.waitFor(); System.out.println("执行完成,退出码:" + exitCode); } catch (IOException | InterruptedException e) { e.printStackTrace(); }
方法2:直接设置ProcessBuilder的工作目录(更推荐)
其实没必要用cd命令,ProcessBuilder本身就支持设置工作目录,这样代码逻辑更清晰,还能避免cd命令可能出现的错误(比如目标目录不存在):
try { // 指定批处理要运行的工作目录 File workingDir = new File("C:\\Users\\vk\\Logs"); ProcessBuilder probuilder = new ProcessBuilder( "cmd.exe", "/C", "C:\\Users\\Vk\\TestBatch.bat && C:\\Python27\\ArcGIS10.3\\python.exe C:\\Users\\vk\\TestScript2.py" ); // 给ProcessBuilder设置工作目录 probuilder.directory(workingDir); probuilder.redirectErrorStream(true); Process process = probuilder.start(); int exitCode = process.waitFor(); System.out.println("执行完成,退出码:" + exitCode); } catch (IOException | InterruptedException e) { e.printStackTrace(); }
几个小提醒:
- 路径尽量统一大小写:你代码里一会儿
C:\users\VK一会儿C:\Users\Vk,Windows虽然不区分大小写,但统一写法能避免不必要的坑 - 选对连接符:如果批处理执行失败了你还是想继续跑Python,就把
&&换成&;如果必须批处理成功才执行Python,就保留&& - 别忘了处理异常:IO异常和中断异常都要捕获,不然程序遇到问题会直接崩溃
内容的提问来源于stack exchange,提问作者user3853393
相关产品推荐
相关产品推荐

