package com.ruoyi.utils.process;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.io.BufferedReader;
|
import java.io.File;
|
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 workingDir, 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 (workingDir != null && !workingDir.isEmpty()) {
|
builder.directory(new File(workingDir));
|
}
|
// 获取子进程的环境变量映射
|
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命令来启动可执行程序并显示命令提示符窗口
|
log.debug(String.join(" ", command));
|
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();
|
}
|
}
|
}
|