package com.insigma.utils; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import java.io.*; /** * CommandImpUtil Windows 下执行命令
* 【注意】 目录使用的 >>> 下划线 <<< * * @author admin */ @Slf4j @SuppressWarnings("DuplicatedCode") public class WinCommandUtil implements Runnable { private String command; private final String CMD = "cmd"; private final String EXE = "cmd /c "; public WinCommandUtil(String command) { if(StringUtils.startsWithIgnoreCase(command, CMD)){ this.command = command; }else{ this.command = EXE + command; } } @Override public void run() { Process process; int exitVal = 0; try { log.debug("准备执行命令:{}",command); process = Runtime.getRuntime().exec(command); // Runtime.exec()创建的子进程公用父进程的流,不同平台上,父进程的stream buffer可能被打满导致子进程阻塞,从而永远无法返回。 //针对这种情况,我们只需要将子进程的stream重定向出来即可。 new RunCmdStreamThread(process.getInputStream(), "INFO").start(); new RunCmdStreamThread(process.getErrorStream(), "ERR").start(); exitVal = process.waitFor(); } catch (IOException | InterruptedException e) { log.error("执行命令发生异常:{}", e.getMessage()); } if (exitVal != 0) { throw new RuntimeException("cmd任务执行失败"); } } static class RunCmdStreamThread extends Thread { InputStream is; String printType; RunCmdStreamThread(InputStream is, String printType) { this.is = is; this.printType = printType; } @Override public void run() { try { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { log.debug("输出:{}>{}", printType, line); } } catch (IOException ioe) { ioe.printStackTrace(); } } } }