java执行cmd命令

本文介绍了如何使用Java执行CMD命令,包括调用cmd命令并输出显示信息,启动本机应用程序EXE的三种方式,以及解决可能的卡死问题。同时提到了系统适配和命令详解等重要内容。

java执行cmd命令

起因:项目需要实现jar包上传到远程私服仓库nexus,查询得有两种方法实现:1.调用nexus rest api 进行发行http请求,这个目前在研究;2.调用maven中的命令将本地仓库中的jar包推送到远程仓库;第二种方法虽然简单,但是扩展性不强,需要部署的服务器上有maven环境,并且在linux和Windows上若都要部署则需要进行系统适配。但不论如何,还是打算学习java执性cmd命令及打开其他程序的操作。本文参考了:https://www.jb51.net/article/80829.htm,https://www.cnblogs.com/zhufu9426/p/7928570.html

Java调用cmd命令,并输出显示信息:
	/**
     * execute cmd in current directory
     * then get the inputStream and print on console
     * the Most commonly used 
     * @throws InterruptedException
     */
    @Test
    public void executeDirCMD() throws InterruptedException {
        try {
            Runtime rt = Runtime.getRuntime();
//            Process pr = rt.exec("cmd /c dir");
//            Process pr = rt.exec("D:/APP/Evernote/Evernote.exe");//open evernote program
            Process pr = rt.exec("D:/APP/Tim/Bin/QQScLauncher.exe");//open tim program
            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream(),"GBK"));
            String line = null;
            while ((line = input.readLine())!=null){
                System.out.println(line);
            }
            int exitValue = pr.waitFor();
            System.out.println("Exited with error code "+exitValue);
        } catch (IOException e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }
    }
Java启动本机应用程序EXE的三种方式:
1.利用cmd方式 
    @Test
    public void executeApplicationByCMD(){
        String command = "D:/APP/Tim/Bin/QQScLauncher.exe";
        Runtime rt = Runtime.getRuntime();
        try {
            Process pr = rt.exec(command);
            BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream(), "UTF-8"));
            String line = null;
            StringBuilder build = new StringBuilder();
            while ((line = br.readLine()) != null) {
                build.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
2.利用ProcessBuilder调用cmd方式
/** 
 * 启动应用程序 
 * 
 * @param programName 
 * @return 
 * @throws IOException 
 */ 
public static void startProgram(String programPath) throws IOException { 
 log.info("启动应用程序:" + programPath); 
 if (StringUtils.isNotBlank(programPath)) { 
  try { 
   String programName = programPath.substring(programPath.lastIndexOf("/") + 1, programPath.lastIndexOf(".")); 
   List<String> list = new ArrayList<String>(); 
   list.add("cmd.exe"); 
   list.add("/c"); 
   list.add("start"); 
   list.add("\"" + programName + "\""); 
   list.add("\"" + programPath + "\""); 
   ProcessBuilder pBuilder = new ProcessBuilder(list); 
   pBuilder.start(); 
  } catch (Exception e) { 
   e.printStackTrace(); 
   log.error("应用程序:" + programPath + "不存在!"); 
  } 
 } 
} 

3.使用Desktop启动应用程序 
    /**
     * execute By Desktop
     */
    @Test
    public void executeByDesktop(){
        String programPath ="D:/APP/Tim/Bin/QQScLauncher.exe";
        try {
            Runtime.getRuntime().exec("notepad");
            Desktop.getDesktop().open(new File(programPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
如果多次执行可能出现卡死现象,请参考:https://www.cnblogs.com/wang-liang-blogs/p/11022869.html
执行原理
常用命令详解
cmd /c dir 是执行完dir命令后关闭命令窗口。 
cmd /k dir 是执行完dir命令后不关闭命令窗口。 

cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。 
cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。 
注:增加了start,就会打开新窗口,可以用cmd /?查看帮助信息。

例:cmd /c copy d:\\test.txt e:将d盘的test文件复制到e盘,直接copy是识别不了为cmd命令的,所以在前面添加cmd /c来启动一个控制台应用程序;而如果是运行一个可执行程序,则直接将将command改为“F:\\apache-tomcat-6.0.20.exe”这样既可。
扩展资料

1.Java实现命令行中的进度条功能:参考:https://www.youkuaiyun.com/gather_23/NtjaMgxsMzY1LWJsb2cO0O0O.html

常常需要进行的系统适配
判断目前运行的是windows还是linux,可以使用:
		Properties properties = System.getProperties();
        String property = properties.getProperty("os.name");
        System.out.println(property);
获取到运行的系统名,进行判断则可以使用:
	/**
	 * 系统枚举类
	 *
	 * @author libowan
	 */
	public enum OSType {
	    LINUX,
	    WINDOWS,
	    OTHERS;
	}
	/**
     * get current <code>OSType</code>
     * @return OSType
     */
    public static OSType getCurrentOSType(){
        String s = System.getProperty("os.name").toLowerCase();
        if (s.contains("linux")) return OSType.LINUX;
        if (s.contains("windows")) return OSType.WINDOWS;
        return OSType.OTHERS;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值