`
chenhua_1984
  • 浏览: 1252075 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

讨论:java调用windows 下dos命令wmic的奇怪现象

阅读更多

   java 与外部进程通信。 由于java 是跨平台的,有时候我们需要用到操作系统的一些信息,为了方便期间,干脆就直接调用操作系统的命令来实现,比如查看IP地址,MAC地址等。不过两个在jdk6里面已经有了,不过以前都是用调用dos 命令,然后获取输出的办法来做的,比如:

import java.io.*;
public class DT {
      public static void main(String[] args) throws IOException
      {
      String command="ipconfig";
      Runtime r=Runtime.getRuntime();
      Process p=r.exec(command);
      BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
      StringBuffer sb=new StringBuffer();
      String inline;
      while(null!=(inline=br.readLine())){
      sb.append(inline).append("\n");
      }
      System.out.println(sb.toString());
      }
}

 这样的话可以得到如下的结果:

Windows IP Configuration
Ethernet adapter VMware Network Adapter VMnet8:



   Connection-specific DNS Suffix  . :

   IP Address. . . . . . . . . . . . : 192.168.79.1

   Subnet Mask . . . . . . . . . . . : 255.255.255.0

   Default Gateway . . . . . . . . . :



Ethernet adapter VMware Network Adapter VMnet1:



   Connection-specific DNS Suffix  . :

   IP Address. . . . . . . . . . . . : 192.168.23.1

   Subnet Mask . . . . . . . . . . . : 255.255.255.0

   Default Gateway . . . . . . . . . :



Ethernet adapter 本地连接:



   Connection-specific DNS Suffix  . :

   IP Address. . . . . . . . . . . . : 192.168.100.12

   Subnet Mask . . . . . . . . . . . : 255.255.255.0

   Default Gateway . . . . . . . . . : 192.168.100.250

 然而,当我在执行wmic 命令的时候,想要获取它的输出确不行了,看代码:

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ManagerArgs {

	public static void main(String[] args) {
		try {
		
			Process p = Runtime.getRuntime().exec("cmd.exe /c wmic process get name,executablepath");
		
			BufferedReader br = new BufferedReader(new InputStreamReader(p
					.getInputStream()));
			String line = "";
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
			br.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 程序在执行的时候就柱塞 了,根本获取不到想ipconfig 那样的结果,把命令放到DOS 命令里面取执行,看图片:


这里确实可以的。难道wmic 命令的结果java 就取不到了吗?同样的都是dos 命令,为啥就有这样的区别呢?大家发表下自己的看法?谢谢!

 

  • 大小: 140.8 KB
分享到:
评论
28 楼 xiaohuafyle 2012-05-28  
这个帖子回答了这个问题.
http://blog.csdn.net/ragic/article/details/5583164
27 楼 mallon 2009-09-25  
今天也发现了这了问题,没想到GOOGLE一下子就搜到了这里,呵呵
26 楼 liusu 2009-07-09  
那估计是在win7下这个命令做过优化,刚刚在xp下试了一下,确实不行。
25 楼 chenhua_1984 2009-07-02  
liusu 写道
package com.liusu.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class DT {
	public static void main(String[] args) throws IOException {
		String command = "wmic process get name,executablepath";
		Runtime r = Runtime.getRuntime();
		Process p = r.exec(command);
		BufferedReader br = new BufferedReader(new InputStreamReader(p
				.getInputStream()));
		StringBuffer sb = new StringBuffer();
		String inline;
		while (null != (inline = br.readLine())) {
			sb.append(inline).append("\n");
		}
		System.out.println(sb.toString());
	}
}


我就用这个代码,可以得到正确输出。 系统是Win7 RC

其实如果是“阻塞”的,直接在Process p = r.exec(command);之后加一句p.waitFor()就可以了吧。只要不要一直阻塞死了不回来就可以了

我win7上面没有试过!也许Win7优化过吧!我用的是XP,关于p.waitFor(),这个我试过了,不行XP上!
24 楼 liusu 2009-07-01  
package com.liusu.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class DT {
	public static void main(String[] args) throws IOException {
		String command = "wmic process get name,executablepath";
		Runtime r = Runtime.getRuntime();
		Process p = r.exec(command);
		BufferedReader br = new BufferedReader(new InputStreamReader(p
				.getInputStream()));
		StringBuffer sb = new StringBuffer();
		String inline;
		while (null != (inline = br.readLine())) {
			sb.append(inline).append("\n");
		}
		System.out.println(sb.toString());
	}
}


我就用这个代码,可以得到正确输出。 系统是Win7 RC

其实如果是“阻塞”的,直接在Process p = r.exec(command);之后加一句p.waitFor()就可以了吧。只要不要一直阻塞死了不回来就可以了
23 楼 ray_linn 2009-07-01  
为什么不直接用javacom ? wmi也是以com的形式提供的
22 楼 px96004 2009-07-01  
真的支持一下。非常期待JAVA直接执行命令。
JAVA完不成的还可以用C去写一个EXE来完成。
21 楼 chenhua_1984 2009-07-01  
phoenix520 写道
windows2003下面没有wmic这个命令?

试过的,有!先输入wmic 会提示安装!目前在2000,XP,2003都试过
20 楼 phoenix520 2009-07-01  
windows2003下面没有wmic这个命令?
19 楼 mycigar 2009-07-01  
之前也遇到过这个问题,当时也是用wmic这个命令,发现必须要关闭InputStream和OutputStream,原因不详。不过我感觉wmic这个命令应该是和普通的dos命令不一样的,具体哪不一样,不知道了。
18 楼 chenhua_1984 2009-07-01  
cats_tiger 写道
要用多线程读取输出,另外ProcessBuilder可以合并错误流和正常流,你可以试试。到google查一下“java runtime exec 挂起”也可以找到正确答案。当然,最好的答案在《Java谜题》的82题中。

有的人说是缓冲区太小,装不下结果,有的人说是没有flush和close!
17 楼 cats_tiger 2009-06-30  
要用多线程读取输出,另外ProcessBuilder可以合并错误流和正常流,你可以试试。到google查一下“java runtime exec 挂起”也可以找到正确答案。当然,最好的答案在《Java谜题》的82题中。
16 楼 chenhua_1984 2009-06-30  
mymGrubby 写道
wmic 类似 ftp dos命令不会自动关闭输入流,

ipconfig 这类命令会自动关闭??

这个原因??????????

我怀疑也是!
15 楼 mymGrubby 2009-06-30  
wmic 类似 ftp dos命令不会自动关闭输入流,

ipconfig 这类命令会自动关闭??

这个原因??????????
14 楼 oxromantic 2009-06-30  
和OutputStream 没有任何关系,请不要参考InputStream.available()

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class CallDoc {

	public static void main(String[] args) throws IOException {
		Process p = Runtime.getRuntime().exec(
				new String[] { "wmic", "process", "get", "name" });
		InputStream input = p.getInputStream();
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		byte buff[] = new byte[1024];
		int len = 0;
		while ((len = input.read(buff)) != -1) {
			bos.write(buff, 0, len);
		}
		input.close();
		System.out.println(bos.toString());
	}
}
13 楼 chenhua_1984 2009-06-30  
hintcnuie 写道
是不是应该考虑下apache common下的exec 工具?
这个需要额外的jar包的!
12 楼 whaosoft 2009-06-30  
这是没注意过这个~!
11 楼 hintcnuie 2009-06-30  
是不是应该考虑下apache common下的exec 工具?
10 楼 chenhua_1984 2009-06-30  
myworkfirst 写道
    虽然命令执行了,但InputStream流里并没有数据,该对象的内存空间,并没有取到任何数据。

  InputStream 默认给了8192个byte,read(byte[]) 里,走不进去,看了jdk源码,没有找到InputStream 里是为空数据原因。
    
    再跟踪下jdk源码,看看是否知道原因

说的有道理,但是为什么有的命令确不需要flush,close就可以取到呢?比如 :
cmd.exe /c ipconfig /all
这个命令不需要就可以得到结果。是不是windows的命令不同内部的处理机制也不同呢?
9 楼 myworkfirst 2009-06-30  
    虽然命令执行了,但InputStream流里并没有数据,该对象的内存空间,并没有取到任何数据。

  InputStream 默认给了8192个byte,read(byte[]) 里,走不进去,看了jdk源码,没有找到InputStream 里是为空数据原因。
    
    再跟踪下jdk源码,看看是否知道原因

相关推荐

    用于Wmic命令行无效情况下的补丁

    标题中的“用于Wmic命令行无效情况下的补丁”指的是针对Windows Management Instrumentation Command-line (WMIC)工具在Windows 7或Windows Server 2008系统上出现故障或无法正常工作时,需要应用的修复程序。WMIC是...

    WMIC-Java:可以执行 WMIC 和命令行参数。 需要适当的 GUI 和需要管理员权限的工作命令

    WMIC-Java 可以执行 WMIC 和命令行参数。 需要适当的 GUI 和需要管理员权限的工作命令。 由一个主方法和来自 3 ... 可以使用 WMIC 收集来自计算机的许多有用信息,因此我认为看看 java 是否可以执行这些命令会很有趣。

    修复windows下不能使用wmic命令.bat

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行系统管理的支持。非常好用命令,这个脚本用于修复wmic不能使用的问题

    修复windows下不能使用wmic命令的脚本

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行系统管理的支持。非常好用命令,这个脚本用于修复wmic不能使用的问题

    Java调用外部程序命令

    ### Java调用外部程序命令详解 #### 一、引言 在进行系统集成或自动化脚本编写时,经常需要从Java程序中调用外部程序或命令。这种需求常见于多种场景,例如远程服务管理、批处理操作等。本文将详细介绍如何使用...

    好用的DOS命令

    - `wmic process where "name='explorer.exe' and executablepath<>'%SystemDrive%\\windows\\explorer.exe'" delete`:结束非系统目录下的`explorer.exe`进程。 8. **内存和文件信息**: - `wmic memlogical get...

    dos命令大全,包含所有DOS命令

    在现代Windows版本中,很多DOS命令被Windows命令行工具(PowerShell或CMD)所继承,如`wmic`用于Windows Management Instrumentation Command-line,允许更高级的系统管理和脚本编写。此外,还有一些命令是Windows...

    WMIC命令详解

    ### WMIC命令详解 #### 背景与概念 WMIC(Windows Management Instrumentation Command-line)作为微软在Windows Server 2003中推出的一种全新的命令行管理工具,结合了WMI的强大功能与命令行的简洁特性。对于那些...

    计算机常用dos命令大全

    ### 计算机常用DOS命令详解 在计算机操作系统中,DOS(Disk Operating System)命令行界面是一种非常实用的工具,它可以帮助用户执行各种管理任务。本文将详细介绍一系列常用的DOS命令及其功能,帮助您更好地理解和...

    dos命令中copy教程大全.doc

    【DOS命令中的COPY详解】 COPY是DOS操作系统中用于文件复制的一个基本命令,它的主要功能是将源文件复制到目标位置,创建一个与源文件内容完全相同的副本。COPY命令适用于简单文件复制,而在需要更高级选项如递归...

    windows 系统下启动与结束java的jar包的脚本(包括如何设置进程名称)

    ### Windows系统下启动与结束Java的JAR包的脚本(包括如何设置进程名称) 在Windows环境下管理和控制Java应用程序的启动与停止是一项常见的任务。本文将详细介绍如何编写一个批处理脚本来实现这些功能,并且还会...

    wmic实例应用修改版

    描述:"wmic超实用 dos学习必看,全面了解操作系统" 知识点: ### 一、WMIC基础概念 **WMIC(Windows Management Instrumentation Command-line)**是一种强大的命令行工具,用于管理和访问Windows管理信息库...

    wmic实例应用

    wmic 实例是一种强大的命令行工具,用于管理和监控 Windows 操作系统的各种资源。下面是 wmic 实例在磁盘管理、系统服务管理和进程管理等方面的应用。 磁盘管理 wmic 实例可以用于查看磁盘的属性,例如磁盘的标题...

    wmic命令行介绍及使用.pdf

    WMIC,全称为Windows Management Instrumentation Command Line,是Windows操作系统中的一个强大工具,它扩展了Windows Management Instrumentation(WMI)的功能,允许用户通过命令行界面执行系统管理和监控任务。...

    dos命令大全.pdf

    这只是DOS命令大全中的一部分,每个命令都有其特定的用途和用法,熟练掌握这些命令可以极大地提高在命令行环境下的工作效率。了解并运用这些命令,无论是进行系统维护、文件管理还是自动化任务,都能得心应手。

    第八十课:基于白名单Wmic执行payload第十季.docx

    WMIC通常位于Windows系统的特定目录下,并且其路径被包含在系统的PATH环境变量中,这意味着用户可以在任何命令提示符窗口中直接调用`wmic`命令。具体而言,在不同版本的Windows操作系统中,WMIC的默认位置如下: - ...

Global site tag (gtag.js) - Google Analytics