java运行Windows命令

转载地址:http://walsh.iteye.com/blog/449051

如何用Java来调用Windows上的wmic命令来获取系统中当前的进程信息。我的第一印象是用Runtime.exec()肯定是可以的,但一写就发现,事情并没有那么的简单。我又找到了一篇比较老的文章,仔细阅读,才明白了其中的细节。下面是一些要点: 


  • 等待命令执行结束用waitFor(),其返回值就是命令的返回值。
  • 如果出现程序执行被挂起,没有任何反应的情况,是由于没有读取命令子进程的正常输出流或错误输出流导致缓冲区被占满,进程被锁住。这个时候需要把输出流中的内容给读出来。最好的做法是使用两个线程,分别同时读取正常输出流和错误输出流。
  • 执行Windows平台上的命令时使用cmd.exe /C,如cmd.exe /C dir。
  • 记得关闭命令子进程的输出流,通过Process.getOutputStream().close(),这样不会导致命令子进程被锁住。


仿照上面文章中,写了一个简单的例子。 

Java代码   收藏代码
  1. package cmd;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6.   
  7. class StreamDrainer implements Runnable {  
  8.     private InputStream ins;  
  9.   
  10.     public StreamDrainer(InputStream ins) {  
  11.         this.ins = ins;  
  12.     }  
  13.   
  14.     public void run() {  
  15.         try {  
  16.             BufferedReader reader = new BufferedReader(  
  17.                     new InputStreamReader(ins));  
  18.             String line = null;  
  19.             while ((line = reader.readLine()) != null) {  
  20.                 System.out.println(line);  
  21.             }  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26.   
  27. }  
  28.   
  29. public class TestRunCmd {  
  30.   
  31.     public static void main(String[] args) {  
  32.         String[] cmd = new String[] { "cmd.exe""/C""wmic process get name" };  
  33.         try {  
  34.             Process process = Runtime.getRuntime().exec(cmd);  
  35.               
  36.             new Thread(new StreamDrainer(process.getInputStream())).start();  
  37.             new Thread(new StreamDrainer(process.getErrorStream())).start();  
  38.               
  39.             process.getOutputStream().close();  
  40.   
  41.             int exitValue = process.waitFor();  
  42.             System.out.println("返回值:" + exitValue);  
  43.         } catch (Exception e) {  
  44.             e.printStackTrace();  
  45.         }  
  46.   
  47.     }  
  48.   
  49. }  


1.介绍几个主要方法:

[plain]  view plain copy
  1. Process exec(String command)   
  2.          在单独的进程中执行指定的字符串命令。  
  3. Process exec(String command, String[] envp)   
  4.          在指定环境的单独进程中执行指定的字符串命令。  
  5. Process exec(String command, String[] envp, File dir)   
  6.          在有指定环境和工作目录的独立进程中执行指定的字符串命令。  
  7. Process exec(String[] cmdarray)   
  8.          在单独的进程中执行指定命令和变量。   
  9. Process exec(String[] cmdarray, String[] envp)   
  10.          在指定环境的独立进程中执行指定命令和变量。   
  11. Process exec(String[] cmdarray, String[] envp, File dir)   
  12.          在指定环境和工作目录的独立进程中执行指定的命令和变量。   

command:一条指定的系统命令。

envp:环境变量字符串数组,其中每个环境变量的设置格式为name=value;如果子进程应该继承当前进程的环境,则该参数为null。

dir:子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为null。

cmdarray:包含所调用命令及其参数的数组。


2.介绍运行命令时的参数:
cmd[[{/c|/k}][/s][/q][/d][{/a|/u}][/t:fg][/e:{on|off}][/f:{on|off}][/v:{on|off}]string] 

参数 
/c 
执行string指定的命令,然后停止。 
/k 
执行string指定的命令并继续。 
/s 
修改位于/c或/k之后的string处理。 
/q 
关闭回显。 
/d 
禁用自动运行命令执行。 
/a 
创建美国国家标准协会(ANSI)输出。 
/u 
创建Unicode输出。 
/t:fg 
设置前景f和背景g的颜色。下表列出了可用作f和g的值的有效十六进制数字。值颜色 
0黑色 
1蓝色 
2绿 
3湖蓝色 
4红 
5紫色 
6黄 
7白色 
8灰色 
9浅蓝色 
A浅绿色 
B浅水绿 
C浅红色 
D浅紫色 
E浅黄色 
F亮白色 

/e:on 
启用命令扩展。 
/e:off 
禁用命令扩展。 
/f:on 
启用文件和目录名完成。 
/f:off 
禁用文件和目录名完成。 
/v:on 
启用延迟的环境变量扩展。 
/v:off 
禁用延迟的环境变量扩展。 
string 
指定要执行的命令。 
/? 
在命令提示符显示帮助。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值