通过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. transform、accumulate —— C++ 下的 MapReduce

    accumulate:Map,逐元素分别单独处理: 注:for_each:不改变区间元素的内容,所以更多的是输出打印等功能: accumulate:Reduce,整体化归为一个单独的数值: 两个函数均 ...

  2. Erlang 学习笔记

    http://wenku.baidu.com/link?url=AUQR8Hn-e-fEB_lqjXsd8XfapWj1qAK7J05JoBXFib_LlSk5qSOTia8HIxNV1XkeZi-k ...

  3. AnimatorSet和PropertyValuesHolders.ofKeyframe

    如果要多个动画配合工作,需要把他们放入AnimatorSet中 ObjectAnimator animator1 = ObjectAnimator.ofFloat(...); animator1.se ...

  4. 【t003】string

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为" ...

  5. POJ 2418-Hardwood Species(map)

    Hardwood Species Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 18770   Accepted: 740 ...

  6. 使用Java Service Wrapper将java程序作为linux服务并且开机自动启动

    以java应用程序为例,打包为tianlong.jar,程序入口为tianlong.QueueTest. 下面在linux的/opt下建立tianlong目录,复制tianlong.jar到/opt/ ...

  7. 查询系统状态 内存大小 cpu信息 设备负载情况

    1.1 查看内存状态 /proc/meminfo里面存放着内存的信息 查看内存命令(包括虚拟内存swap): free -h (低版本系统可能不支持-h) 或者 free -m (以mb单位显示) a ...

  8. Windows消息:WM_USER与WM_APP的区别

    Windows消息范围及意义 #define WM_USER 0x0400 #define WM_APP 0x8000 0到WM_USER-1 Messages reserved for use by ...

  9. octopress第三方插件:博文同步工具syncPost

    为了增加外链等考虑,独立博客往往有将博文同步到其他博客社区的需求.自己人肉黏贴的方式笨拙.重复,对于程序猿而言,着实不可取. 我在 github 上找到了 syncPost 这个针对 octopres ...

  10. scipy 图像处理(scipy.misc、scipy.ndimage)、matplotlib 图像处理

    from scipy.misc import imread / imsave / imshow imresize / imrotate / imfilter 1. scipy.misc 下的图像处理 ...