亲测可用
直接上工具类的代码:
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class NoteUtil {
/**
* 执行bat脚本文件,弹出cmd黑窗
* @param command 执行脚本文件命令
* @param navigatePath 脚本文件所在文件夹地址
*/
public static void runExecution(List<String> command, File navigatePath) {
System.out.println(command);
ProcessBuilder executeProcess=new ProcessBuilder(command);
executeProcess.directory(navigatePath);
try {
Process resultExecution = executeProcess.start();
}catch (Exception e){
}
}
/**
* 执行bat脚本,读取cmd输出内容
* 注意:按行执行的,所以需要注意脚本编写的时候一条命令需要写进一行中,而且还要注意执行命令时所在的文件夹地址,如果是需要在特定文件夹下执行的命令,则需要每行命令开始时跳转到该目录
* @param batPath 执行的脚本文件绝对路径
*/
public static Map<String, String> runExecution2(String batPath) {
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(batPath), "UTF-8"));//读取脚本
String line;
List<String> batList = new ArrayList();
while ((line = br.readLine()) != null) {
if (!line.equals("")) {
batList.add(line);
}
}
for (String command : batList) {
Process pro = Runtime.getRuntime().exec("cmd /c " + command);
BufferedReader br1 = new BufferedReader(new InputStreamReader(pro.getInputStream(), "GBK"));
BufferedReader br2 = new BufferedReader(new InputStreamReader(pro.getErrorStream(), "GBK"));
System.out.println("Input Stream:");
while ((line = br1.readLine()) != null) {
System.out.println(line);
sb1.append(line).append(System.getProperty("line.separator"));
}
System.out.println("Error Stream:");
while ((line = br2.readLine()) != null) {
System.out.println(line);
sb2.append(line).append(System.getProperty("line.separator"));
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
Map map = new HashMap();
map.put("getInputStreamString", sb1.toString());
map.put("getErrorStreamString", sb2.toString());
return map;
}
}
public static void main(String[] args) {
//cmd弹窗
File jsFile=new File("D:\\application\\bat文件所在的目录");
String cmdPrompt="cmd";
String type="/c";
String start = "start";
String bat="run.bat";
List<String> updateCommand=new ArrayList<String>();
updateCommand.add(cmdPrompt);
updateCommand.add(type);
updateCommand.add(start);
updateCommand.add(bat);
runExecution(updateCommand,jsFile);
//不需要弹窗,获得命令执行后的输入流,打印执行结果
System.out.println(runExecution2("D:\\application\\脚本文件绝对路径.bat"));
}
}
在测试的发现,如果弹窗来执行bat脚本,那么java代码中获取到的输入流中是空的
bat脚本使用 && 对两条语句进行拼接,语句拼接的时候注意注释,以免脚本都拼接到注释后面去了导致执行不到