使用 Java 调用 cmd 命令
使用 java 调用 cmd 命令时,使用如下的代码(不需要导入其他库)
Runtime.getRuntime().exec(command); //command是需要运行的命令
但是呢,这样是运行不了的,要进行异常处理,或者将其抛出:
//这里选择异常处理
try {
Runtime.getRuntime().exec(command);
} catch (IOException e1) { // 改自己的异常类
e1.printStackTrace();
}
现在,可以运行exe文件,但是若运行 gpedit.msc devmgmt.msc 等工具无反应
解决办法是,设定cmd的运行模式(这不是java的语法,是cmd的程序参数):
#转至https://blog.csdn.net/liuyukuan/article/details/5974517
cmd /c command 执行完命令后关闭命令窗口。
cmd /k command 执行完命令后不关闭命令窗口。
cmd /c start command 会打开一个新窗口后执行命令,原窗口会关闭。
cmd /k start command 会打开一个新窗口后执行命令,原窗口不会关闭。
将命令改变后,就可以正常使用会弹出新窗口的工具了
但是,如果要调用出命令行及没有图型界面的工具或程序,则要用后面两个命令,不然不会弹出。
例如:
Runtime.getRuntime().exec("cmd /c powershell"); // 无反应
Runtime.getRuntime().exec("cmd /c start powershell"); // 成功调出powershell
个人理解是: java会在后台运行一个终端,然后再运行输入的代码,但是这个终端是不会到前台的,所以没图形界面的程序虽然能运行,但是无法显示.
等等,那要怎么获取命令的返回值呢?
首先,Runtime.getRuntime().exec()会返回被调用的进程,我们需要获取这个进程
接着,再通过输入流,让java程序读取被调用程序的返回值,再将其输出便可
例如:
/* 记得引入java.io中的相关包 */
// 获取进程
Process process = Runtime.getRuntime().exec("cmd /c dir"); // 运行dir命令
// 获取进程的输入流 流的方向为(唤醒的进程 -> java程序)
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
// 若读取当前行不为空,就将其输出
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 将流关闭,避免浪费系统资源
reader.close();
此时,java程序就会打印出DIR命令的执行结果
但是注意,cmd不能加start参数,因为加上了会创建新的终端执行,java就得不到执行结果了
总结:
1. java运行可执行文件,随意使用任意一种cmd运行方式
2. 执行 *.msc 类文件,cmd要加上start参数(也就是后两种运行模式之一)开启新窗口.
3. 想要得到运行的返回值,要先获取到进程,再得到它的输入流,并且cmd不能加上start参数,否则会在新的终端窗口执行.
个人感觉是:带GUI程序任意,终端程序后两种,要得到返回值的话前两种
补充:
学生党,单纯做笔记使用,若有不足之处请指正,感激不尽!