iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Java中怎么调用WMIC命令
  • 295
分享到

Java中怎么调用WMIC命令

2023-06-17 10:06:59 295人浏览 八月长安
摘要

本篇文章为大家展示了Java中怎么调用WMIC命令,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。今天要写个远程重启服务的功能,为了开发速度,暂时定为Java代码+WMIC命令的方法,简单的说,就是利

本篇文章为大家展示了Java中怎么调用WMIC命令,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

今天要写个远程重启服务的功能,为了开发速度,暂时定为Java代码+WMIC命令的方法,简单的说,就是利用Java调用本机应用程序的方法。涉及到的Java类有java.lang包里面的Runtime、Process、ProcessBuilder三个类,以及wmic中重启服务的命令。因为之前也写过这方面的东西,所以很习惯性的写出了代码:

Process p = Runtime.getRuntime().exec("wmic ...");  BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  String tmp = null;   while ((tmp = br.readline()) != null) {      System.out.println(tmp);  }  int exitValue = p.waitfor();

运行,结果发现程序不能退出,Debug发现程序阻塞在br.readline()中了,强制结束程序,发现重启服务的命令正常下下去了,去掉程序中获得标准输出的地方和获得返回结果的地方,命令也能正常下去,而且正常退出。

为什么程序会阻塞呢?Google了一下,发现了大家的解释,应该也是比较权威的解释吧:每个进程都有自己的标准输入、标准输出、标准错误输出,对于某些依赖于OS的进程,可能其输出缓冲区很小,如果不能及时的读出(标准输出、标注错误输出),将导致进程不能正常退出。我的程序中标准输出已经读了,显然原因不是这个,难道是错误输出缓冲区中的数据没有读出导致的?带着这个疑问,对程序作了一些更改:

ProcessBuilder pb = new ProcessBuilder("wmic",...);  pb.redirectErrorStream(true);  Process p = pb.start();  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了一下,大家的评论大多还是关于标准输出和标准错误输出,那这程序应该是没有问题了。后来在cmd中敲入wmic的命令,发现wmic命令敲入以后会进入一个自有的提示符中,难道是因为标准输入的问题。后来又google了一下,验证了我的猜想,果然是因为wmic进程会等待标准输入,而程序中没有处理标准输入的地方,是标准输入阻塞了进程的退出,修改代码:

ProcessBuilder pb = new ProcessBuilder("wmic",...);  pb.redirectErrorStream(true);  Process p = pb.start();  p.getOutputStream().close();  BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  String tmp = null;   while ((tmp = br.readline()) != null) {      System.out.println(tmp);  }  int exitValue = p.waitfor();

编译运行,程序成功执行。果然是标准输入的原因。

后来执行的过程中换了一个服务的名称,发现执行失败(能够正常退出,但是返回的结果是“无效动作”),但是同样的命令,在命令行中执行成功,而且直接适用Runtime.exec()方法中写入整个命令也能够执行成功,难道是ProcessBuilder的错误,ProcessBuilder构造函数有两个:

ProcessBuilder(List<String> command)

利用指定的操作系统程序和参数构造一个进程生成器。

ProcessBuilder(String... command)

利用指定的操作系统程序和参数构造一个进程生成器。

找到ProcessBuilder的源代码,发现了对List<String>的解析方法:jdk将List中的所有字符串用空格连接,对list中的每个字符串JDK先判断串中是否包含空格,如果包含空格,用双引号将该字符串引起来,再拼到前面字符串的后面(应该是为了解决路径中包含空格的问题),可恰好Wmic命令的参数中有一段是name="ServiceName",如果ServiceName中包换空格,JDK就会把name="service name"的外层加一个双引号,导致wmic不能解析该命令了。

问题终于全都解决了,耗费了多半天的时间,不过收获总是有的,这里总结一下,在使用Java调用外部命令的时候,一定要注意对标准输出、标准输入和错误输出的处理。对于一般的命令,只需要将标准输出和错误输出合并,一起读出来或者在另外的线程中读出来,而对于一些特殊的命令,还有处理标准输入。建议即使不使用标准输入,先close了,总是不会出错了。另外,使用ProcessBuilder时要注意它的空格处理方式是否是你想要的,如果不是,就不能用ProcessBuilder了,直接使用Runtime.exec()就好了。

上述内容就是Java中怎么调用WMIC命令,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: Java中怎么调用WMIC命令

本文链接: https://www.lsjlt.com/news/288291.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中怎么调用WMIC命令
    本篇文章为大家展示了Java中怎么调用WMIC命令,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。今天要写个远程重启服务的功能,为了开发速度,暂时定为Java代码+WMIC命令的方法,简单的说,就是利...
    99+
    2023-06-17
  • WMIC命令怎么在Windows中使用
    本篇文章为大家展示了WMIC命令怎么在Windows中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。wimic的运行方式可以有两种法:搞入wimic进入后输入命令运行,键入wimic后出现wmi...
    99+
    2023-06-08
  • java中怎么调用linux命令
    在Java中调用Linux命令可以使用`Runtime`类的`exec`方法,以下是一个示例: import java.io.Buf...
    99+
    2023-10-26
    java linux
  • java怎么调用ffmpeg命令
    在Java中调用FFmpeg命令可以使用`Runtime.getRuntime().exec(command)`方法,其中`comm...
    99+
    2023-10-12
    java
  • java怎么调用shell命令
    Java中可以通过`Runtime`类或者`ProcessBuilder`类来调用shell命令。1. 使用`Runtime`类调用...
    99+
    2023-09-29
    java
  • 如何正确的使用wmic 命令
    这期内容当中小编将会给大家带来有关如何正确的使用wmic 命令,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。wmic 获取进程名称以及可执行路径:wmic process get name,executa...
    99+
    2023-06-08
  • Java调用CMD命令
    在Java开发中,有时候需要与操作系统的命令行交互,执行特定的CMD命令或脚本。然而,处理编码问题是调用CMD命令时常遇到的挑战。正确处理编码可以避免输出结果的乱码,确保程序的稳定运行。本文将介绍Java中调用CMD命令的方法,并重点解...
    99+
    2023-08-20
    java microsoft
  • vbscript中怎么调用 Dir 命令
    这期内容当中小编将会给大家带来有关vbscript中怎么调用 Dir 命令,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。你好, CR.从你的邮件来看,你想做一件类似如下所示的简单工作:Set o...
    99+
    2023-06-08
  • Python中怎么调用zip命令
    Python中怎么调用zip命令,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python调用zip命令例子程序是这样的:#!/usr/bin/Python &...
    99+
    2023-06-17
  • Java怎么调用Shell命令和脚本
    这篇文章主要为大家展示了Java怎么调用Shell命令和脚本,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Java怎么调用Shell命令和脚本”这篇文章吧。Java可以用来干什么Java主要应用于...
    99+
    2023-06-06
  • RMAN中debug调式命令怎么用
    这篇文章主要介绍RMAN中debug调式命令怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、Rman中DEBUG命令是做什么的?RMAN中使用debug参数的目的有两个:1....
    99+
    2024-04-02
  • java存储过程怎么调用OS命令
    小编给大家分享一下java存储过程怎么调用OS命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 先看一下这个目录[oracle@ocean ~]$ pwd/ho...
    99+
    2023-06-03
  • java中jps命令怎么用
    小编给大家分享一下java中jps命令怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!jps(Java Virtual Machine Process Sta...
    99+
    2023-06-22
  • perl怎么调用shell命令
    在Perl中,可以使用反引号或`qx//`操作符来调用shell命令。使用反引号调用shell命令的示例:```perlmy $ou...
    99+
    2023-10-07
    perl
  • python怎么调用shell命令
    在Python中,可以使用`subprocess`模块来调用shell命令。下面是一个简单的示例:```pythonimport s...
    99+
    2023-08-30
    python shell
  • 怎么在python中使用virtualenv调用命令
    本篇文章为大家展示了怎么在python中使用virtualenv调用命令,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(...
    99+
    2023-06-14
  • java中config命令怎么使用
    在Java中,config命令通常不是Java的内置命令,而是用于特定框架或库的配置命令。因此,具体的使用方法取决于你使用的框架或库...
    99+
    2023-09-15
    java
  • python中调用dos命令
    本文是基于window系统下的调用dos命令,在centos下也类似 #encoding:utf-8 ''' Created on 2015年10月10日 @author: ZHOUMEIXU204 ''' import os impo...
    99+
    2023-01-31
    命令 python dos
  • Python怎么调用系统命令
    一、os.system方法这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息。os.system(cmd)的返回值。如果执行成功,那么会返回0,表示命令执行成功。否则,则是执行错误...
    99+
    2023-05-23
    Python
  • python调用调用Linux命令
    如何调用Linux命令下面代码演示了调用一个shell命令, 其中,命令的输出会存储到result变量中, 而命令的返回值,则存储到exitcode中,由此可见,调用shell命令还是很方便的:import commandsexitcode...
    99+
    2023-01-31
    命令 python Linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作