在Java执行下面的windows的wmic命令时,
wmic cpu get loadpercentage /value wmic os get totalvisiblememorysize,freephysicalmemory /value wmic process where(name="java.exe") get name,creationdate,workingsetsize,pagefileusage /value
遇到了从Process的InputStream中读执行结果时,程序阻塞在读的语句处,如下代码所示:
ProcessBuilder pb = new ProcessBuilder("wmic",...); // pb.redirectErrorStream(true); // 注释代码1 Process p = pb.start(); // p.getOutputStream().close(); // 注释代码2 BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String tmp = null; while ((tmp = br.readline()) != null) { //阻塞代码处 System.out.println(tmp); } int exitValue = p.waitfor();
通过google,Java method calls the WMIC command提到根据操作系统的不同,每个Process的InputStream的大小不等,当InputStream没有足够的空间来保存执行结果时,执行结果会输出到ErrorStream当中。但是当我把上面注释代码1放开之后(另外的一个方案是创建两个线程,一个从InputStream读取执行结果,一个从ErrorStream中读取执行结果),程序仍然阻塞在read代码处。
继续google,提到了有可能因为Process是在等待输入结束的标志,在上面代码中,我们只是输入了wmic命令,但是没有结束输入,所以放开上面的注释代码2,问题解决。终于可以得到正确的输出了。
值得一提的是,当我们在创建的Process中先打开一个单独的cmd窗口,再执行上面的wmic命令时,确可以得到正确的输出结果。
上述代码在Win7,Win2008上可以很好的并发执行。但是在WinXP和Win2003上并发执行时,确遇到了如下的错误:
Win32 Error: The process cannot access the file because it is being used by another process
通过观察发现,在WinXP和Win2003上执行代码时,会生成一个临时的TempWmicBatchFile.bat文件,因此就可以解释上面的现象了,因为临时文件的访问没有被同步。但是如果对每个命令执行都同步这个临时文件,当命令很多时,有可能出现大面积等待的请求。考虑到我们不需要时时得到最新的数据,因此我们对每个命令的执行结果都进行了缓存,而对命令的执行进行了同步,这样每次来的新命令就可以先拿缓存的执行结果,然后把自己放到等到命令队列中。这样就有效的避免了上面的错误。
相关推荐
WMIC-Java 可以执行 WMIC 和命令行参数。 需要适当的 GUI 和需要管理员权限的工作命令。 由一个主方法和来自 3 个不同接口的覆盖方法组成,一个用于 WMIC 命令,一个用于常规 cmd 命令,另一个用于需要管理员权限的...
批处理bat命令,用wmic模式自动配置环境变量,不用刷新环境变量.直接就可以用,避开了重器服务麻烦.
标题中的“用于Wmic命令行无效情况下的补丁”指的是针对Windows Management Instrumentation Command-line (WMIC)工具在Windows 7或Windows Server 2008系统上出现故障或无法正常工作时,需要应用的修复程序。WMIC是...
wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档
WMIC(Windows Management Instrumentation Command-line)是Windows操作系统中内置的一个命令行工具,用于访问Windows管理 instrumentation(WMI)提供程序。WMI是微软的一种系统管理架构,它允许管理员和其他应用...
**WMIC(Windows Management Instrumentation Command-line)**是一种强大的命令行工具,用于管理和访问Windows管理信息库(WMI)。通过WMIC,用户可以在命令行界面中执行复杂的管理任务,而无需编写脚本或使用图形...
WMIC(Windows Management Instrumentation Command-line)作为微软在Windows Server 2003中推出的一种全新的命令行管理工具,结合了WMI的强大功能与命令行的简洁特性。对于那些偏好命令行操作的系统管理员而言,...
WMIC,全称为Windows Management Instrumentation Command Line,是Windows操作系统中的一个强大工具,它扩展了Windows Management Instrumentation(WMI)的功能,允许用户通过命令行界面执行系统管理和监控任务。...
WMIC(Windows Management Instrumentation Command-line)是Windows操作系统自带的一个强大的命令行工具,可以用来查询、设置以及管理Windows系统的各种信息。下面介绍如何使用WMIC来查看磁盘的属性。 - **命令**:...
WMIC(Windows Management Instrumentation Command-line)是Windows操作系统中的一个强大的命令行工具,它允许用户通过WMI(Windows Management Instrumentation)接口进行系统管理。WMIC能够提供对操作系统、硬件...
wmic.c C语言实现WMI
WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行系统管理的支持。非常好用命令,这个脚本用于修复wmic不能使用的问题
Windows Management Instrumentation Command-line(WMIC)是Windows操作系统中一个强大的工具,它允许用户通过命令行接口执行各种系统管理和监控任务。WMIC是基于WMI(Windows Management Instrumentation)技术,...
在本资源中,"wmic取硬件信息模块源码"是指利用Windows Management Instrumentation Command-line (WMIC)工具来获取计算机硬件信息,并将其转化为易语言可以处理的数据。WMIC是Windows操作系统内置的一个命令行接口...
WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行系统管理的支持。非常好用命令,这个脚本用于修复wmic不能使用的问题