使用 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程序任意,终端程序后两种,要得到返回值的话前两种

 

补充:

学生党,单纯做笔记使用,若有不足之处请指正,感激不尽!

posted @ 2022-01-08 19:24  悠米呦  阅读(12183)  评论(3编辑  收藏  举报