zoukankan      html  css  js  c++  java
  • python(或BAT脚本)自动执行adb shell以后的命令

    最近在用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

    --------------------------------------------------------------------------------

    关注微信公众号(测试工程师小站)即可在手机上查阅,并可接收更多测试分享,发送【测试资料】更可获取百G测试教程~

  • 相关阅读:
    关于might_sleep的一点说明---CONFIG_DEBUG_ATOMIC_SLEEP【转】
    让你的软件飞起来:RGB转为YUV【转】
    Linux终端彩色打印+终端进度条【转】
    Linux中实现一个简单的进度条【转】
    Linux内核官方文档atomic_ops.txt【摘自Linux 内核文档】
    Linux 内核链表的使用及深入分析【转】
    Linux2.6.32内核笔记(5)在应用程序中移植使用内核链表【转】
    spin_lock & mutex_lock的区别? 【转】
    Linux c括号作用域【原创笔记】
    linux C 中的volatile使用【转】
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/9312766.html
Copyright © 2011-2022 走看看