通过cmd.exe来执行adb命令,可以进行一些命令组合,直接用adb.exe的话只能执行单个adb命令

  这里要注意cmd 中的/c参数,指明此参数时,他将执行整个字符串中包含的命令并退出当前cmd运行环境

  如:

  命令:C:\Windows\system32>cmd /c E:\Work\Projects\lenovo_lmsa\lmsa-client\Bin\adb.exe devices | findstr "3"
      3b2ac4c5 device

  命令执行成功

  当去掉/c时,将一直处于执行状态并不会退出(当通过下面的方法执行时WaitForExit方法将处于阻塞状态)

  命令:C:\Windows\system32>cmd E:\Work\Projects\lenovo_lmsa\lmsa-client\Bin\adb.exe devices | findstr "3"

  当去掉/c 与管道命令时,执行情况如下(同命令C:\Windows\system32>cmd结果一致)

  命令:C:\Windows\system32>cmd E:\Work\Projects\lenovo_lmsa\lmsa-client\Bin\adb.exe devices

      Microsoft Windows [Version 10.0.10586]
      (c) 2015 Microsoft Corporation. All rights reserved.

  所以,在代码中一定得注意/c参数的使用

  我在代码中执行 adb install -s serial -r file.apk时,如果目标设备未连接,此adb命令会阻塞等待设备连接,此时线程会阻塞,所以我执行adb devices | findstr "serial" && adb adb install -s   serial -r file.apk命令,先判断目标设备是否还连接,然后在装apk,能大大降低阻塞的概率

  方法调用代码片段(当命令较复杂时,最好用括号括起来,比如有路径什么的时候,不用括号把命令括起来,命令解析会失败)

     string exe = System.IO.Path.Combine(Environment.SystemDirectory, "cmd.exe");
string targetCmd = string.Format("/c (\"{0}\" devices | findstr \"{1}\" && \"{0}\" -s \"{1}\" {2})"
, System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"adb.exe")
, deviceId
,sourceCommand);

  Process方法代码:

 public string Do(string exe, string command, int timeout)
{
      List<string> response = new List<string>();
List<string> output = new List<string>();
List<string> error = new List<string>();
Process process = new Process(); process.StartInfo.FileName = exe;
process.StartInfo.Arguments = command;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.EnableRaisingEvents = true;
System.IO.FileInfo file = new System.IO.FileInfo(exe);
process.StartInfo.WorkingDirectory = file.Directory.FullName;
process.OutputDataReceived += (object sender, System.Diagnostics.DataReceivedEventArgs e) => Redirected(output, sender, e);
process.ErrorDataReceived += (object sender, System.Diagnostics.DataReceivedEventArgs e) => Redirected(error, sender, e);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
bool exited = process.WaitForExit(timeout);
if (!exited)
{
process.Kill();
response.Add("Error: timed out");
}
response.AddRange(output);
response.AddRange(error);
string data = String.Join("\r\n", response.ToArray());
if (data.EndsWith("\r\n"))
{
data = data.Remove(data.LastIndexOf("\r\n"));
}
return data;
}

.Net 通过Cmd执行Adb命令 /c参数的更多相关文章

  1. Kubernetes(k8s)为容器设置启动时要执行的命令和参数

    创建 Pod 时设置命令及参数 创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数.如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的参数,就填写在配置文件的 ...

  2. CMD执行BCP命令

    C:\>BCP "EXEC GetU '2016-7-11' ,'-1'" queryout "C:\\C3Marketing\SummaryReport_test ...

  3. windows在cmd执行svn 命令

    1. 使用svn 命令行工具. 找到http://www.visualsvn.com/downloads/ 下载Apache Subversion command line tools,这是一个可以在 ...

  4. 通过ant调用shell脚本执行adb命令

    在Hudson或者Jenkins中利用ant的exec 来调用shell命令,通过shell脚本来执行adb shell命令,可以正常执行,不会出现在ant中直接调用adb shell出现的假死情况. ...

  5. java调用cmd执行maven命令

    一.原理介绍 Java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后封闭命令窗口. cmd /k di ...

  6. Python脚本实现在cmd执行相关命令

    通过Python脚本实现,在cmd命令执行文件的cp(复制).rm(删除).rename(重命名).move(文件移动).mkdir(创建目录) cmd执行命令格式:python xxx.py 用户名 ...

  7. 在go中通过cmd调用python命令行参数量级过大问题解决

    问题描述如下: 在go中使用cmd调用python命令行 cmd := exec.Command("python", "dimine/Kriging/matrix.py& ...

  8. mac eclipse 执行adb 命令,提示command not fount

    java执行命令: p = Runtime.getRuntime().exec(commandStr); [INFO ] 执行命令结果:nullbash: adb: command not found ...

  9. cmd执行jmeter命令生成报告的问题。

    现有几个jmeter脚本,准备以命令行的方式执行jmeter脚本,并生成报告. 一.使用python语言处理 1.目录结构 2.说明 jmx目录下是jmeter脚本 result目录下是生成的报告及文 ...

随机推荐

  1. 【t062】最厉害的机器人

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] [背景] Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ [问题描述] ...

  2. HTML中DOM对象的属性和方法的层级关系是怎样的?(目录即层次)

    HTML中DOM对象的属性和方法的层级关系是怎样的?(目录即层次) 一.总结 一句话总结:目录就是测试题 1.document取得元素(get element)的方式有哪几种? 解答:四种,分别是id ...

  3. ssh连接上腾讯云、华为云Linux服务器,一会就自动断开

    客户端向服务端发送心跳 依赖 ssh 客户端定时发送心跳,putty.SecureCRT.XShell 都有这个功能. Linux / Unix 下,编辑 ssh 配置文件: # vim /etc/s ...

  4. Tomcat下ajax请求路径总结

    ajax的url有两种,一种是绝对路径,另一种是相对路径.   一.绝对路径:包括协议名称.主机地址.端口.web项目名称等的完整请求路径. 例如: $.ajax({     url:"ht ...

  5. VS2012经常使用的快捷方式完成最全面

    (1)如何更改设置快捷键 1.转到工具----选项  对话框 2.选  环境---->键盘 3.在 [显示命令包括] 以下的对话框中输入"对齐"keyword,然后就会在这个 ...

  6. 《Head First 设计模式》学习笔记——命令模式

    在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务" ...

  7. ant的condition任务

    1.istrue isfalse:断言 真 假 <project name="testCondition"> <target name="test&qu ...

  8. JIL 编译与 AOT 编译

    JIT:Just-in-time compilation,即时编译:AOT:Ahead-of-time compilation,事前编译. JVM即时编译(JIT) 1. 动态编译与静态编译 动态编译 ...

  9. [ACM] POJ 2689 Prime Distance (筛选范围大素数)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12811   Accepted: 3420 D ...

  10. atitit.提高开发效率---mda 革命性的软件开发方法

    atitit.提高开发效率---mda 革命性的软件开发方法 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和事实上现相分离 2 3. 眼下的问题模型和代码不同步 2 4.  ...