Java 执行CMD/DOS
最近在写一个自己的邮箱服务器里用到
监视及起/停 windows 中的服务,调查发现还是得用dos来做这些事情
说一下遭遇战的过程
首先是java里如何执行DOS命令,查到下记函数
Runtime.getRuntime().exec()
(到这你可以试着启动个 记事本 计算器的了Runtime.getRuntime().("notepad"); Runtime.getRuntime().("calc"); )
然后就是准备dos命令
服务启动 sc start "服务名"
服务停止 sc start "服务名"
服务状态 sc query "服务名"
(引号必须)
然后是返回值的问题了 起/停 的命令执行后是有返回值的
还没发现比较好的对应方案 现在基本上就是把原本打印在 cmd框里的一行行输出出来自己判断
private Map<String, String> executeCmd(String cmd) {
Runtime rt = Runtime.getRuntime(); // 运行时系统获取
Map<String, String> lineMap = new HashMap<String, String>();//存放返回值
try {
Process proc = rt.exec(cmd);// 执行命令
InputStream stderr = proc.getInputStream();//执行结果 得到进程的标准输出信息流
InputStreamReader isr = new InputStreamReader(stderr);//将字节流转化成字符流
BufferedReader br = new BufferedReader(isr);//将字符流以缓存的形式一行一行输出
String line = null;
while ((line = br.readLine()) != null) {
if (!StringUtils.isEmpty(line)) {
String[] strLine = line.split(":");
if(strLine.length>=2) {
lineMap.put(strLine[0].trim(), strLine[1].trim());
} }
}
br.close();
isr.close();
stderr.close();
} catch (IOException e) {
e.printStackTrace();
}
return lineMap;
}
ps: L11-17 根据不同的命令的执行结果不同 相应改变的 我这里得到的是 xx : yy 这样的所以这样处理
接下来就是 如是 bat 文件 怎么对处
同样的方法 把命令换成你的bat路径就好了 ,这个就不多说了想说一个关于权限的问题
bat文件的话 如果权限不够 通常会邮件bat文件以管理员身份运行 会这样的处理
但java里怎么处理?如下
@echo off
mode con lines= cols=
% mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",)(window.close)&&exit
cd /d "%~dp0"
rem
之后再加上你要写的bat命令就好了
现在想想突然感觉很可怕有 admin 权限 也可以自己写cmd 创建 shell 执行 ...
还有一个就是 看当网上说 因执行命令过多或者执行内容过多 会造成Runtime阻塞问题,基本解决方案是多线程处理
就是把子进程的输出流(getInputStream)和错误流(getOutputStream)分给两个线程来做处理 如下
public class StreamManage extends Thread {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
InputStream inputStream;
String type;
public StreamManage(InputStream inputStream,String type) {
this.inputStream = inputStream;
this.type = type;
}
public void run () {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
try {
while((line = bufferedReader.readLine()) !=null ) {
if(type.equals("Error")) {
logger.error(line);
}else {
logger.debug(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里应该没什么要说的就是把把输出流穿过来做输出处理,然后调用的地方
L8,9
private void startMailServer() {
String cmd = "sc start \"James 2.3.2.1\"";// dos 命令
Runtime rt = Runtime.getRuntime(); // 运行时系统获取
try {
// Process proc = rt.exec(cmd);// 执行命令
File filePath = new File("src\\main\\resources\\static\\bat\\runStart.bat");
Process proc = rt.exec(filePath.toString());
StreamManage errorStream = new StreamManage(proc.getErrorStream(), "Error");
StreamManage outputStream = new StreamManage(proc.getInputStream(), "Output");
errorStream.start();
outputStream.start();
} catch (IOException e) {
e.printStackTrace();
}
}
基本上就这些
最后说一个残留问题
就是 cmd窗口 闪屏的问题 如果执行的的是 命令 这个问题不存在 如果是 bat 不是要获取 admin 权限这个问题也没有 猜测 上记 获取权限的代码 造成了闪屏 调查中... 有知道的请告知
Java 执行CMD/DOS的更多相关文章
- java执行cmd命令并获取输出结果
1.java执行cmd命令并获取输出结果 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apa ...
- Windows使用Java执行cmd代码
话不多说,直入正题 今天给大家分享下,怎么在Windows上使用Java执行Cmd代码! 首先默认大家都熟悉cmd代码,以及cmd的命令行操作. 直接在main方法中写这一行(需要抛出异常),可以直接 ...
- 如何使用Java执行cmd命令
用JAVA代码实现执行CMD命令的方法! Runtime rt = Runtime.getRuntime(); Process p = rt.exec(String[] cmdarray); ...
- java执行cmd命令和linux命令
文章出处http://blog.csdn.net/xh16319/article/details/17302947 一:window下执行cmd指定 一:window下执行cmd指定 程序例子: [j ...
- Java执行cmd命令、bat脚本、linux命令,shell脚本等
1.Windows下执行cmd命令 如复制 D:\tmp\my.txt 到D:\tmp\my_by_only_cmd.txt 现文件如图示: 执行代码: private static void run ...
- 解决方案--java执行cmd命令ProcessBuilder--出错Exception in thread "main" java.io.IOException: Cannot run program "dir d:\": CreateProcess error=2(xjl456852原创)
当我尝试在java中通过ProcessBuilder运行window的cmd命令时出现错误: public static void main(String [] args) throws IOExce ...
- Java执行CMD命令
参见:https://blog.csdn.net/lixingshi/article/details/50467840 public static void runtimeCommand() thro ...
- JAVA执行cmd命令方法
package com.cmd; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStre ...
- java中执行cmd命令
一.java执行cmd命令的三种方式:http://www.jb51.net/article/80829.htm 参考:https://www.cnblogs.com/zhufu9426/p/7928 ...
随机推荐
- win10 uwp 读取保存WriteableBitmap 、BitmapImage
我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap.关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说.主要说的 ...
- PHP之回调函数传参(解决eval函数拼接对象参数的问题)
在使用Smarty时,定义了一个统一调用控制器的函数,如下: function C($name, $method){//控制器的名称和其中方法的名称 require_once "contro ...
- ZendStudio-12.5.0-win32.win32.x86_64.msi官方版本及破解工具
网上的工具试了好多,最后下载的这个工具成功了,之前的N个工具都失败了 亲自试用,表示有效!!! ZendStudio-12.5.0-win32.win32.x86_64.msi官方版本下载地址: 百 ...
- servlet过滤器简化版
什么是过滤器 在struts2 中集成了过滤器,并可以根据需要选择合适自己的过滤器进行配置 , 过滤器:是基于函数回调的,运用java中的反射机制工作在struts2只能对于action起作用,在se ...
- JAVA基础知识总结:十
一.抽象类 1.定义 当多个类中出现相同功能,但是功能主体是不同的,这是可以进行向上抽取的,只抽取功能的定义部分,使用抽象类实现 抽象类的存在就是为了被继承 2.使用 abstract 3.抽象类的特 ...
- 【20171025早】alert(1) to win 练习
本人黑绝楼,自称老黑,男,25岁,曾经在BAT工作过两年,但是一直都是底层人员,整天做重复性工作,甚敢无趣,曾和工作十年之久的同事聊天,发现对方回首过往,生活是寡淡如水,只有机械性工作.旋即老黑毅然决 ...
- 最全的命令行(gradle)打包安卓apk
最近研究安卓方面的打包,因为是React Native,不能使用Android studio打包.找了半天资料,发现没有一个全面的.下面,我来讲解自己下打包时自己遇到的各种坑. 1.首先,需要在项目顶 ...
- Go语言中slice使用注意事项
Go 语言中的slice类型可以理解为是数组array类型的描述符,包含了三个因素: 指向底层数组的指针 slice目前使用到的底层数组的元素个数,即长度 底层数组的最大长度,即容量 因此当我们定义一 ...
- jvm - 垃圾回收
jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 垃圾回收的意义 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回 ...
- Android O --Soong Build
Concept: Kati (https://android.googlesource.com/platform/build/kati/) - Reads Android.mk files -> ...