一、正常使用
使用 java 调用 cmd 命令时,使用如下的代码(不需要导入其他库) ,存在异常需要抛出或捕获,下面方法可以直接使用。
// 接收命令在本地cmd执行
public Map<Integer, String> exec(String command) {
StringBuilder sb = new StringBuilder();
Integer value = -1;
// key为命令执行结果,value为命令执行响应内容
Map<Integer, String> map = new HashMap<>();
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
String line;
while ((line = bufferedReader.readLine()) != null) {
line.trim();
sb.append(line);
}
process.waitFor();
// 只有命令执行成功才会返回0
value = process.exitValue();
map.put(value, sb.toString());
return map;
} catch (IOException | InterruptedException e) {
log.error("执行命令失败[" + e.getMessage() + "]");
}
return map;
}
方法解释:
- StringBuilder对象是为了拿到返回值,并拼接为一个字符串。
- value参数只是一个标记,因为执行完CMD命令之后,可以由process.exitValue()拿到一个数字类型的返回值,该返回值只有在CMD命令执行成功并成功退出的时候返回0。因此,可以根据这个返回值知道命令是否运行成功。
- Map对象中只有一个数据,key为命令是否执行成功,value为执行命令的返回值。
- .exec(command)是开始执行CMD命令,并得到Process对象返回值,可以由该对象得到一个输入流,该流就是执行命令的返回值。
- .waitFor()方法目的是为了保证CMD命令执行完毕。
二、特殊使用
上面的正常使用可以运行exe文件,但是若运行 gpedit.msc devmgmt.msc 等工具无反应。解决办法是,设定cmd的运行模式,也是直接在exec方法中执行即可(这不是java的语法,是CMD的程序参数):
CMD程序参数:CMD程序参数-CSDN博客
例如:60秒倒计时关机命令
.exec("cmd tsshutdn");