Administrator
2023-08-25 7f21d4f22ec711d6aa89900b07e0b5ac31dbac42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package com.ruoyi.utils.process;
 
import lombok.extern.slf4j.Slf4j;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
 
/**
 * @Description: cmd命令工具类
 * @ClassName: CmdUtils
 * @Author: 刘苏义
 * @Date: 2023年07月29日13:24:21
 * @Version: 1.0
 **/
@Slf4j(topic = "cmd")
public class CmdUtils {
    //启动命令1
    public static void commandStart(String processName, List<String> command, Map<String, String> env) {
        log.debug("启动外部程序:【" + processName+"】");
//        command.forEach(v -> log.debug(v + " "));
        log.debug(String.join(" ", command));
        ProcessBuilder builder = new ProcessBuilder();
 
        // 获取子进程的环境变量映射
        if (env != null) {
            env.entrySet().forEach(entry -> {
                log.debug(entry.getKey() + ":" + entry.getValue());
            });
            Map<String, String> envMap = builder.environment();
            envMap.putAll(env);
        }
        //正常信息和错误信息合并输出
        builder.redirectErrorStream(true);
        builder.command(command);
        //开始执行命令
        Process process = null;
        try {
            process = builder.start();
            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
//            String line = "";
//            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
//            while ((line = br.readLine()) != null) {
//                System.out.println(line);
//            }
        } catch (IOException e) {
            log.error("cmd异常:" + e.getMessage());
        }
    }
 
    // 结束指定名称的进程
    public static void stopProcess(String processName) {
        log.debug("尝试结束进程:" + processName);
        ProcessBuilder builder = new ProcessBuilder("taskkill", "/F", "/IM", processName);
        Process process;
        try {
            process = builder.start();
            //如果你想获取到执行完后的信息,那么下面的代码也是需要的
            String line = "";
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
            while ((line = br.readLine()) != null) {
                log.debug("回显:" + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    // 检查指定名称的进程是否正在运行
    public static boolean isProcessRunning(String processName) {
        try {
            ProcessBuilder builder = new ProcessBuilder("tasklist");
            Process process = builder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                if (line.contains(processName)) {
                    log.debug("进程" + processName + "已存在");
                    return true;
                }
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        log.debug("进程" + processName + "不存在");
        return false;
    }
 
    //启动命令2
    public static void commandStart(String[] command) {
        //构建启动命令,使用cmd /c start命令来启动可执行程序并显示命令提示符窗口
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.redirectErrorStream(true); // 将错误输出重定向到标准输出
        Process process = null;
        try {
            process = processBuilder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //如果你想等待程序完成
        try {
            int exitCode = process.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}