CmdExecute.java
/**
* @(#) CmdExecute.java Created on 2012-7-19
*
* Copyright (c) 2012 Aspire. All Rights Reserved
*/
package com.aspire.sqmp.mobilemanager.service.adb;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* The class <code>CmdExecute</code>
*
* @author wuyanlong
* @version 1.0
*/
public class CmdExecute {
/**
* Execute a command
*
* @param cmd
* @return
* @throws IOException
*/
public static CmdResponse exec(String cmd) throws IOException {
ReadInputStream msgReadding = null;
ReadInputStream errorMsgReadding = null;
CmdResponse respone = new CmdResponse();
Process process = null;
try {
process = Runtime.getRuntime().exec(cmd);
// 获取进程的错误流
errorMsgReadding = new ReadInputStream(process.getErrorStream());
errorMsgReadding.start();
// 获取正常流信息
msgReadding = new ReadInputStream(process.getInputStream());
msgReadding.start();
// respone
respone.setRunSuccess(process.waitFor() == 0);
respone.setMsg(msgReadding.getMsg());
respone.setErrorMsg(errorMsgReadding.getMsg());
} catch (Exception e) {
respone.setRunSuccess(false);
respone.setErrorMsg(e.getMessage());
e.printStackTrace();
} finally {
try {
if (errorMsgReadding != null)
errorMsgReadding.toStop();
if (msgReadding != null)
msgReadding.toStop();
process.destroy();
} catch (Exception e) {
}
}
return respone;
}
/**
* Execute a command
*
* @param process
* @param command
* @return
*/
public static CmdResponse exec(Process process, String command) {
ReadInputStream msgReadding = null;
ReadInputStream errorMsgReadding = null;
CmdResponse respone = new CmdResponse();
if (process == null) {
respone.setRunSuccess(false);
return respone;
}
DataOutputStream dos = null;
try {
dos = new DataOutputStream(process.getOutputStream());
dos.writeBytes(command + "\n");
dos.writeBytes("exit\n");
dos.flush();
// 获取进程的错误流
errorMsgReadding = new ReadInputStream(process.getErrorStream());
errorMsgReadding.start();
// 获取正常流信息
msgReadding = new ReadInputStream(process.getInputStream());
msgReadding.start();
// respone
respone.setRunSuccess(process.waitFor() == 0);
respone.setMsg(msgReadding.getMsg());
respone.setErrorMsg(errorMsgReadding.getMsg());
} catch (Exception e) {
respone.setRunSuccess(false);
respone.setErrorMsg(e.getMessage());
e.printStackTrace();
} finally {
try {
if (dos != null)
dos.close();
if (errorMsgReadding != null)
errorMsgReadding.toStop();
if (msgReadding != null)
msgReadding.toStop();
process.destroy();
} catch (Exception e) {
}
}
return respone;
}
/**
*
* The class <code>ReadErrorInput</code>
*
* @author wuyanlong
* @version 1.0
*/
static class ReadInputStream extends Thread {
/**
* Running
*/
private boolean running = true;
/**
* Buffer of reading string
*/
private StringBuffer readBuffer = new StringBuffer();
/**
* BufferedReader
*/
private BufferedReader readBr;
private boolean isReading = false;
/**
*
* Constructor
*
* @param is
*/
public ReadInputStream(InputStream is) {
if (is != null)
readBr = new BufferedReader(new InputStreamReader(is));
}
/**
* (non-Javadoc)
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
try {
while (running) {
readding();
sleep(250);
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (readBr != null)
try {
readBr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
super.run();
}
/**
* Reading
*
* @throws IOException
*/
private void readding() throws IOException {
synchronized (this) {
if (isReading)
return;
isReading = true;
}
if (readBr == null)
return;
while (readBr.ready()) {
readBuffer.append(readBr.readLine());
readBuffer.append("\n");
}
synchronized (this) {
isReading = false;
}
}
/**
* To stop thread.
*/
public void toStop() {
running = false;
}
/**
*
* @return
*/
public String getMsg() {
try {
readding();
} catch (IOException e) {
e.printStackTrace();
}
return readBuffer.toString();
}
}
/**
*
* The class <code>CmdRespone</code>
*
* Return response from execute a command
*
* @author wuyanlong
* @version 1.0
*/
public static class CmdResponse {
/**
* Succes of Running
*/
private boolean isRunSuccess;
/**
* Message of success or faild
*/
private String msg;
/**
* Error message
*/
private String errorMsg;
/**
* Getter of isRunSuccess cmdexecute进程运行成功
*
* @return the isRunSuccess
*/
public boolean isRunSuccess() {
return isRunSuccess;
}
/**
* Setter of isRunSuccess
*
* @param isRunSuccess
* the isRunSuccess to set
*/
public void setRunSuccess(boolean isRunSuccess) {
this.isRunSuccess = isRunSuccess;
}
/**
* Getter of msg
*
* @return the msg
*/
public String getMsg() {
return msg;
}
/**
* Setter of msg
*
* @param msg
* the msg to set
*/
public void setMsg(String msg) {
this.msg = msg;
}
/**
* Getter of errorMsg
*
* @return the errorMsg
*/
public String getErrorMsg() {
return errorMsg;
}
/**
* Setter of errorMsg
*
* @param errorMsg
* the errorMsg to set
*/
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
}
分享到:
相关推荐
在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对windows shell的扩展编程不很了解,也缺乏这方面的资料。...
总之,`exec`和`shell_exec`函数在Windows下的权限问题可以通过调整`cmd.exe`的权限来解决,但在实施之前,务必考虑其可能带来的安全影响。在生产环境中,应尽可能遵循最小权限原则,以降低潜在的安全风险。
《Windows Shell 编程指南与实例》是一本深入探讨Windows操作系统壳层编程技术的专业书籍。在Windows系统中,Shell指...无论是个人电脑的日常维护,还是企业级的系统管理,Windows Shell编程都能成为你不可或缺的工具。
下面将详细讲解如何在Windows CMD中使用`adb shell`及`tab`键补全功能。 1. **adb简介** `adb`是Android SDK的一部分,它提供了一个命令行接口,用于连接、管理和控制Android设备或模拟器。开发者可以使用adb进行...
### Windows中SSH Secure Shell Client 的使用方法 #### 一、概述 本文档旨在详细介绍如何在Windows环境下使用SSH Secure Shell Client进行安全的远程访问与文件传输。通过本教程,您将学习到从软件的下载安装、...
- **重要性**: 使用Windows Shell编程可以提升应用程序与操作系统的整合度,让程序更加贴近用户的需求,例如自定义开始菜单、创建特殊的文件夹类型等。 - **适用人群**: 适合希望深入了解Windows系统内部运作机制的...
《Visual C++ Windows Shell Programming》是一本专注于使用Visual C++进行Windows Shell编程的权威指南。在Windows操作系统中,Shell指的是用户界面以及与之交互的各种组件,包括桌面、开始菜单、任务栏等。这本书...
5. **CppShellExtPreviewHandler**和**RecipePreviewHandler.cpp**: 预览处理器是Windows Shell中的一个重要组件,它使得用户能够在不打开文件的情况下预览文件内容。`RecipePreviewHandler`可能是一个具体的预览...
windows下的shell环境模拟程序集合,从cygwin下提取出来,包含常用的命令集合:basename/dirname/mkdir/mv/rm/cp/sort/split/find/awk/sed/xargs/tar/grep/gzip/zip/unzip/head/tail/ls/cat/uniq/wc/more/scp/ssh/...
在.NET框架的开发环境中,有时候我们需要调用Windows操作系统底层的功能,比如管理文件、控制桌面图标、操作任务栏等,这时就离不开对Windows API的使用。Microsoft.WindowsAPICodePack(简称APICodePack)是一个...
《Visual C++ Windows Shell Programming》是由Dino Esposito撰写的一本专著,主要探讨了如何使用Microsoft的Visual C++编程环境来实现Windows壳层(Shell)应用。这本书是英文版,面向熟悉C++编程语言并希望深入...
### Windows Shell Programming 知识点概述 #### 一、Windows Shell 编程基础 - **定义与作用**:Windows Shell 是一个用户界面层,用于帮助用户与操作系统进行交互。它包括了诸如“我的电脑”、“资源管理器”等...
windows版本 mongodb shell:mongosh-2.2.6-win32-x64.zip mongodb shell :https://www.mongodb.com/try/download/shell mongodb相关官网下载地址: mongodb社区版:...
Windows Shell编程是Windows操作系统下的一种高级用户界面编程技术,它涉及到与系统桌面环境的交互,如创建快捷方式、自定义右键菜单、控制面板应用程序以及桌面小工具等。本资源包含了一系列的源代码,用于帮助...
这些接口提供了与Windows Shell交互的方法,让开发者能够定制文件或文件夹在资源管理器中的显示方式和行为。 1. **缩略图视图**:通过实现IExtractIcon和IExtractImage接口,开发者可以为特定文件类型提供自定义的...
Windows下搭建Shell编译环境(3)
Windows Shell编程是Windows操作系统中的一种技术,它允许开发者创建与操作系统界面交互的程序,比如桌面小工具、快捷方式脚本或者自定义右键菜单。Shell编程通常涉及到批处理脚本(Batch Scripting)和Windows脚本...
《Visual C++ Windows Shell Programming》这本书便是一本专门讲解如何使用Visual C++来开发Windows Shell程序的指南。 #### 二、Windows Shell 概述 **Windows Shell**是Windows操作系统的图形用户界面的核心组件...
### Windows 下 Shell 命令大全 在 Windows 操作系统中,shell 命令是进行各种管理和配置任务的重要工具之一。本文将详细介绍一系列常用的 shell 命令及其用途,这些命令对于 Windows 开发者来说非常实用。 #### 1...
总之,《Windows Shell 扩展傻瓜大全》是一份面向中高级开发者的指南,它不仅涵盖了Shell扩展的基础知识,还提供了实践示例,帮助开发者快速上手并掌握如何增强Windows Explorer的功能。尽管原文翻译可能存在不足,...