最近在用python做一个小工具,自动执行一些adb shell命令,使用subprocess.Popen来实现。
 
不过遇到个问题就是执行adb shell后就无法执行后面adb
shell里的命令了,查询得知subprocess.Popen可以自定义stdin参数来源,比如可以使用上一个命令的stdout来做为下一个命令的stdin
 
p1 = subprocess.Popen('adb shell',
 shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
p2 = subprocess.Popen('ls', shell=True, stdin=p1.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print p2.stdout.read()
 
但在这里并未执行成功,怀疑原因是用subprocess执行adb
shell,是在CMD环境下执行,而后面执行ls命令,就已经进入adb shell环境了
 
当然,我们可以直接在CMD中输入adb shell ls来达到目的,但一些adb
shell自有命令如ll、grep在CMD中就无法识别
 
找到两个解决办法:
一、
1.把命令先保存在一个txt文档,如在D盘建一个a.txt,里面保存命令
cat /data/system/packages.xml | grep -E "a|b|c|d"
2.用输入重定向的方法在CMD输入: adb shell < a.txt
可以看到命令已经在CMD中执行了,但是会卡死,此时任何输入有效,但不显示,需要CTRL+C后才会显示出来
3.也可以将第2步做成BAT自动执行,建立一个run.bat,输入
adb shell < d:\a.txt
保存后直接执行run.bat就可以了
 
二、
这个方法虽然可行,但太过麻烦,而且需要第3方的文件来周转,之后在一个网友的帮助下,得到解决办法:
1.依然用python的subprocess.Popen实现
p1 = subprocess.Popen('adb shell cd sdcard&&cd
Android&&cd data&&ls |grep com',
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print p1.stdout.read()
 
同时执行多行命令:
无论是 Linux/Mac 还是 Windows 的 shell 命令都支持一条命令来执行多条命令的。一共有
&&,&,||,| 这么几种方式,这几种方式分别代表着不同的含义:
&&:command1 && command2,如果 command1
执行成功了,就执行命令 command2,如果 command1 失败了,就不会执行 command2 了。
&:command1 & command2,无论 command1 执行成功与否都会执行
command2。
||:command1 || command2,如果 command1 执行成功了,就不会执行 command2 了,如果
command1 失败了,就会继续执行 command2。
|:command1 | command2,command1 的结果做为 command2 的参数,如果 command1
失败了,整个命令也就都失败了。
 
Linux/Mac 下还可以使用 ; 来链接两条命令,顺序执行命令,不管成功与否都往后执行,和 &
含义一样。
 
 
 
参考:http://mzywqwq.blog.163.com/blog/static/958701220134842449172/
http://mp.weixin.qq.com/s?__biz=MjM5NTU0MDg0MA==&mid=2651235866&idx=3&sn=07422d4d4878b9c341701e56258eec4d&chksm=bd04fc1d8a73750b84ff685496e54d10c7e91bdcbf52dce867b261719bd0976a32fcea13b032&mpshare=1&scene=23&srcid=0206kAR2A4w9AySfYB2nvl0d#rd

python(或BAT脚本)自动执行adb shell以后的命令的更多相关文章

  1. BAT脚本如何自动执行 adb shell 以后的命令

    @echo off echo su > temp.txt echo 其它命令 >> temp.txt adb shell < temp.txt del temp.txt 求问 ...

  2. python 使用.bat文件自动执行

    @echo off title demo cmd "/c activate py36 && cd demo&& python demo_test.py&quo ...

  3. 如何在python脚本里面连续执行adb shell后面的各种命令

    如何在python脚本里面连续执行adb shell后面的各种命令 adb shell "cd /data/local && mkdir tmp" adb shel ...

  4. top 自动执行的shell脚本中,使用top -n 1 > log.txt, 上电自动执行,文件无输出

    . 自动执行的shell脚本中,使用top -n > log.txt, 上电自动执行,文件无输出,使用一下命令解决: //usr/bin/top -d -n -b > log.txt 如果 ...

  5. Android 执行 adb shell 命令

    Android 执行Adb shell 命令大多需要root权限,Android自带的Runtime. getRuntime().exec()容易出错,在网上找到了一个执行adb shell命令的类 ...

  6. Android 设备,如何root,执行adb shell,查看设备中的数据库信息等【转】

    原文地址: Android 设备,如何root,执行adb shell,查看设备中的数据库信息等

  7. Bat脚本自动卸载软件-静默执行

    通过Bat脚本卸载软件,原理是得到某软件的ProductCode,然后通过MsiExec.exe命令卸载软件,下面是卸载一个产品的基本代码示例: set ML4.0HF4Name=Product4.0 ...

  8. BATCH+VBS脚本自动执行命令

    打开cmd,然后执行run.bat s 1就会执行tmpsw.vbs的内容,1是作为id传进去的参数. run.bat: @echo off set type=%1 set id=%2 :打开一个te ...

  9. 服务器A制定计划任务,BAT脚本自动备份oracle数据文件,拷贝至服务器B的共享目录。

    运行环境:windows server 2008 R2 目的:在数据库服务器A进行数据库自动备份,并且保留5天. 为了安全,需要在web应用服务器B进行数据库的冗余备份,建立双保险.(保留15天) A ...

随机推荐

  1. 用C#来控制高级安全Windows防火墙

    有的时候我们需要在自己的产品中检测<高级安全Windows防火墙>的状态,并有可能需要加入一些规则甚至需要关闭掉高级安全Windows防火墙. 下面就告诉如何来做: <高级安全Win ...

  2. 关于HTML中时间格式以及查询数据库的问题

    1.默认时间格式,加入属性dateFormate="yyyy-MM-dd" 2.设置默认值,value="2017-6-22" 3.在JavaScript中将获 ...

  3. Java生成不重复的随机数

    public class test { public static int[] Randoms(int number) { Random rand = new Random(); //创建一个新随机数 ...

  4. Http协议--请求报文和响应报文

           http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应 ...

  5. perl 输出当前时间

    #!/bin/perluse POSIX;print strftime("%Y-%m-%d %H:%M:%S", localtime);

  6. linux apache 不解析php文件显示源码

    首先检查是否安装PHP 没有的话就先安装 如果安装过 在/etc/httpd/conf/httpd.conf文件中 在<IfModule mime_module>里面 AddType ap ...

  7. C盘扩展卷是灰色的扩容方法

    当想要扩容C盘的时候可能会发现C盘的扩展卷竟然是灰色的.原因是C盘旁边没有紧挨着的“”未分配空间“”, 只要将D盘的空间分出一些来就可以了. !!!磁盘的分区合并有风险,重要文件等记得先备份  !!! ...

  8. 爬虫学习(五)——使用handler管理器对象进行数据爬取的步骤

    # 使用管理器对象进行爬取数据的步骤 import urllib.requesturl = "https://www.baidu.com/"# 创建handler的管理器对象han ...

  9. js中的日期

    创建日期对象: var date1 = new Date(2018, 11,10)  第二个参数传入的是月份,月份是0-11,实际上要加1 获得现在的时间:var date2 = Date.now() ...

  10. php中关于empty()函数是否为真的判断

    <?php// $a = 0;  ==> 符合empty,empty($a)为true// $a = '0';  ==> 符合empty,empty($a)为true// $a = ...