简述

我们常常会在cmd命令行中输入一些命令,如 cd切换目录,tree 获取文件树结构,或者java -jar 执行jar程序等,如果我们想要在Java代码中去执行cmd命令,并获得和在命令行小黑框中返回的内容,就需要用到Runtime这个API

基本应用

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.nio.charset.Charset;
  5. public class Main {
  6. public static void main(String[] args) {
  7. Runtime runtime = Runtime.getRuntime();
  8. try {
  9. Process process = runtime.exec("cmd /c explorer.exe");//执行命令:打开资源管理器
  10. print(process,"GBK");//注:打开资源管理器,正常情况cmd并不会返回任何内容
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. /**
  16. * 打印输出
  17. * @param process
  18. * @param charset 编码格式,一般为GBK即可
  19. */
  20. public static void print(Process process,String charset) {
  21. try{
  22. BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName(charset)));
  23. String line;
  24. while ((line=br.readLine())!=null) {
  25. System.out.println(line);//如果命令执行正常,则输出返回内容
  26. }
  27. BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream(),Charset.forName(charset)));
  28. String errorLine;
  29. while ((errorLine = error.readLine())!=null) {
  30. System.out.println(errorLine);//如果命令执行错误,则获取并打印内容
  31. }
  32. }catch (Exception e){
  33. e.printStackTrace();
  34. }
  35. }
  36. }

执行Window cmd的注意项

可参考工具类

https://www.yuque.com/huangxiaowei-2hqfi/boylkh/gwmah6

命令前需加上 cmd /c的前缀

一般情况下,执行cmd命令需要加上 cmd /c的前缀
如打开记事本,在cmd执行为输入:notepad
但在代码中执行,则为:

  1. Runtime.getRuntime().exec("cmd /c notepad")

对文件夹进行操作(如dir、tree)

  • 在小黑框中对执行文件夹进行操作,通常需要通过cd等切换到指定目录才能执行,而在java中则不需要

如:我们需要获取E:\tool\ 文件夹下的树结构
在我们将小黑框切换到 E:\tool 目录下后,才可以执行 tree命令,如图:
image.png
而在Java代码中,我们可以调用另一个执行方法:

  1. try {
  2. Runtime runtime = Runtime.getRuntime();
  3. Process process = runtime.exec("cmd /c tree", null, new File("E:\\tool\\"));
  4. print(process,"GBK");//如果文件夹存在,则打印文件树,否则打印错误信息
  5. } catch (IOException e) {
  6. e.printStackTrace();
  7. }

注:runtime.exec(cmd) 等同于 runtime.exec(cmd,null,null)。
第三个参数其实意味着运行的文件夹,比如当我们并没有配置adb环境,但又想执行adb命令,第三个参数可以设置为adb.exe所在的文件夹就可以正常执行了。
如:

  1. try {
  2. Runtime runtime = Runtime.getRuntime();
  3. Process process = runtime.exec("adb version", null, new File("E:\\tool\\adbDir\\"));
  4. print(process,"GBK");
  5. } catch (IOException e) {
  6. e.printStackTrace();
  7. }

常用命令

cmd小黑框控制

  • 打开小黑框

    1. cmd /c start
  • 关闭所有打开的小黑框

    1. cmd.exe /C start wmic process where name='cmd.exe' call terminate

    打开记事本

    1. cmd /c notepad

    打开资源管理器(文件管理器)

  • 进入默认首页

    1. cmd /c explorer.exe
  • 进入指定文件夹

    1. cmd /c explorer.exe E:\\tool\\

    注:进入E盘的tool文件夹

读取指定文件夹

  • 文件夹树结构

    1. cmd /c tree
  • 子文件的信息

    1. cmd /c dir

关机

  1. cmd /c shutdown -s-t 20

注:20秒后关机

  1. shutdown -a

注:取消N秒后关机的任务

  1. cmd /c at 12:05 shutdow /s /f

注:在12点05分关机

  1. cmd /c at /delete

注:取消定时关机的任务

常见问题

CreateProcess error=2, 系统找不到指定的文件

如果该文件实际存在,则一般是因为命令前面没有加上 cmd /c的前缀。如执行 tree,则需要修改为 cmd /c tree

路径中存在空格(如:C:\Program Files (x86)\)的解决方案

将指令的命令包含在双引号“”,即可。

如:

  1. java -jar C:\Program Files (x86)\Game.jar

image.png

  1. java -jar "C:\Program Files (x86)\Game.jar"

这样就可以正常了。

同理:改成以下也是可以的:

  1. "java" "-jar" "C:\Program Files (x86)\Game.jar"