一些业务需求中,可能会涉及 java服务调用windows 的本地服务,下面简单写个demo。
1.首先随便写个脚本test.bat,大概就是打印输入参数,持续几秒模拟exe的运行过程。
直接执行exe的话,cmd 切换到脚本目录,1 2 3即为参数,空格分隔
test 1 2 3
@echo off
echo echo %1 %2 %3
echo 10%
ping -n 3 127.0.0.1>nul
echo 30%
ping -n 3 127.0.0.1>nul
echo 70%
ping -n 3 127.0.0.1>nul
echo 90%
ping -n 5 127.0.0.1>nul
echo 解析完成!
2.封装java函数来调用exe程序,ProcessBuilder 有几个构造方法,如果不需要额外的参数的话,只需要把command传进去即可;带参数的话,需要几个带几个。waitFor是等待程序执行完。
public static void runExe(String p1, String p2, String p3) {
ProcessBuilder pb = new ProcessBuilder(command, p1, p2, p3);
BufferedReader is = null;
try {
Process p = pb.start();
int ret = p.waitFor();
is = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = is.readLine()) != null) {
log.info(line);
}
if (ret == 0) {
log.info("Command has sucessfully completed.");
} else {
log.info("Command completed with return code " + ret);
}
} catch (Exception e) {
log.info("catch Exception " + e.getMessage() + " running command " + command);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
log.info("stream close failed!. ");
}
}
if (null != pb) {
pb.directory();
}
}
}
3.测试
private static String command = "C:\Desktop\test.bat";
public static void main(String[] args) {
runExe("a", "b", "c");
}
4.结果