java调用cmd命令

内置

直接使用Runtime.getRuntime().exec(command);,其中commandcmd命令
但是呢,这样是运行不了的,要进行异常处理,或者将其抛出:

1
2
3
4
5
6
//这里选择异常处理
try {
Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
}

· 可以运行exe文件,
· 无法运行 gpedit.msc devmgmt.msc 等工具

1
2
3
4
cmd /c command 执行完命令后关闭命令窗口。 
cmd /k command 执行完命令后不关闭命令窗口。
cmd /c start command 会打开一个新窗口后执行命令,原窗口会关闭。
cmd /k start command 会打开一个新窗口后执行命令,原窗口不会关闭。

使用start会调用一个新的窗口,可以用来查看没有窗口的命令行

1
2
Runtime.getRuntime().exec("cmd /c  powershell");       // 无反应
Runtime.getRuntime().exec("cmd /c start powershell"); // 成功调出powershell

获取内容

首先,Runtime.getRuntime().exec()会返回被调用的进程,我们需要获取这个进程

接着,再通过输入流,让java程序读取被调用程序的返回值,再将其输出便可

例如:

1
2
3
4
5
6
7
8
9
10
11
12
/* 记得引入java.io中的相关包 */
// 获取进程
Process process = Runtime.getRuntime().exec("cmd /c dir"); // 运行dir命令
// 获取进程的输入流 流的方向为(唤醒的进程 -> java程序)
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()."GBK"));
String line;
// 若读取当前行不为空,就将其输出
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 将流关闭,避免浪费系统资源
reader.close();

此时,java程序就会打印出DIR命令的执行结果

但是注意,cmd不能加start参数,因为加上了会创建新的终端执行,java就得不到执行结果了

在获取内容时,需要将编码格式设置为GBK,否则会出现乱码

process.getInputStream().”GBK”