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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求问 BAT脚本如何自动执行 adb shell 以后的命令相关的知识,希望对你有一定的参考价值。

如下代码
echo off
adb shell
su
当运行到 adb shell后 bat无法继续执行命令 应该是跳转到linux内核 无法识别
求问 如何在 BAT 中实现 linux命令的自动运行
就是说 adb shell 后能继续自动执行su 和相关的linux命令
adb shell su会卡死、
我试过使用命令 adb shell +指令 会提示权限不足
adb shell后 使用SU命令获取权限
然后自动运行linux代码

这是无法实现的。你无法在bat脚本中运行交互式shell命令,你的命令无法发送进入。
bat脚本运行时,是在CMD的环境下运行,它的命令解释器是cmd。
而su在shell环境下执行的,它的命令解释器是shell下的"/system/bin/sh"。

su是一条交互式的shell命令,它需要与shell环境下的用户进行交互操作。

问题就在这里了,
bat脚本只负责将"shell su"作为参数传递执行一次adb.exe。
这个动作完成,这条命令的步骤就算结束了,
但此时su还有一个切换用户身份的动作,如果有密码还会通过shell请求用户输入密码,
但运行bat的cmd环境是它收不到这个请求的。
解决办法:
一. 将su命令之后需要执行的命令写成一个sh脚本。
通过adb将sh脚本推入手机中,并为脚本添加可执行权限
在bat中添加一条比方说这样的命令
adb shell ". /path/to/your/file.sh"

二. 安装superSU授权管理器
安装superSU授权管理器后执行
adb root
授权,允许adb以root身份运行。
这之后你通过adb 发送的shell命令会以root身份执行。
参考技术A 你可以试一下下面的方法:
@echo off
echo su > temp.txt
echo 其它命令 >> temp.txt
adb shell < temp.txt
del temp.txt本回答被提问者采纳
参考技术B & adb shell

Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试

需求

在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回键出现 Dialog 弹窗,点击确认退出按钮,返回 A 界面。不断循环。

思路

一开始想到的就是按键精灵,下了 mac 版使用后发现功能太不完善,于是试了试 Windows 版,实在是操作不习惯。在搜索资料过程中了解到还可以使用 adb 来实现模拟设备操作,那肯定是写代码更顺手啊,配合使用脚本重复输入命令,就能实现简单的自动化重复操作了。

实现

模拟设备操作

常用的按钮都有特定的 keyevent 代号,例如返回键代号4(其他按键可参考文末文章中介绍),模拟返回键的点击只需要在命令行中输入 adb shell input keyevent 4 即可。

模拟点击屏幕中某点的命令是 adb shell input tap x y,(x,y)是相应的坐标点,这就涉及到了对坐标点的计算。巧的是,正好之前写了个涂鸦的 demo (Github 地址App 下载地址),可以使用该 demo 来调试点击的坐标点是否符合我们的期望。

不同机型分辨率不同,坐标点位置肯定是不一样的。比较理想的结果应该是我们输入固定的坐标点,然后代码里自动获取机型的屏幕密度等信息并自动转换。这里为了快速开发出这个小功能,就简单使用了最耿直的不同机型设置不同坐标的方法 ╮(╯▽╰)╭。

所以单步实现上述需求的命令就是:

adb shell input tap 200 300  //点击(200,300)坐标点(假设该点就是跳转按钮所在位置)
adb shell input keyevent 4 //点击退出,弹出是否确认退出 Dialog
adb shell input tap 500 600  //点击(500,600)坐标点(假设该点就是确认退出按钮所在位置)

一次模拟进出界面的测试就完成了。

自动化

在命令行窗口输入命令便可实现单步操作,那想要自动化实现整个流程自然就是要做到自动输入命令。Shell 脚本可以实现这样的功能。后面要做的就简单了:确定需要实现的功能 –> 学习相应的 Shell 脚本语法 –> 编写脚本。

需要的功能

Shell 脚本的第一行必须为 #!/bin/bash。使用命令:sh 脚本名.sh 运行脚本。

打印 log(时间、循环次数等)

echo 在命令行输出一段日志。例如 echo "Hello World"

打印当前时间:

time=$(date +%m-%d--%H:%M:%S)`
echo "时间:$time

简单的交互

例如输入不同机型代号。read -p "What's your name?" myName 该语句会将用户的输入存储在 myName 变量中,再根据变量做判断处理。使用变量在变量名前加 $ 符号即可。例如:

read -p "What's your name?" myName
echo "Hi, $myName"

定义变量

直接使用 变量名=值 方式定义。要注意变量名和值与 = 号中间不要有空格,且变量命名要符合规范:
- 首个字符必须为字母(a-z,A-Z)
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)

if else 判断

read -p "What's your name?" myName
if [ "$myName" = "yazhi" ];then
    echo "I know you!"
else
    echo "Nice to see you!"
fi

这里要注意 [] 符号前后的空格,少了空格会提示语法错误,语句最后要跟 fi

如果有多个条件:

if [ "$myName" = "yazhi" ] || [ ! -n "$myName" ];then  //如果输入了"yazhi",或者没有输入
...

休眠(业务是耗时的)

sleep 5 :休眠5秒

While 循环

while [ "1" = "1" ]  #死循环
do
    echo "do something"
done

基本用得到的语法就上述这些,最后贴一下我的脚本:

#!/bin/bash

echo "开始自动化进出教室"

quitTime=10

read -p "课程数据量是否很大?默认是(y/n)  : " waitTime
if [ "$waitTime" = "y" ] || [ ! -n "$waitTime" ];then
    quitTime=7 #数据量多的课程
    echo "当前课程数据量较大"
elif [ "$waitTime" = "n" ]; then
    quitTime=5 #数据量少的课程
    echo "当前课程数据量较小"
else
    echo "输入错误"
    exit 0
fi

enterRoomX=0 #进入教室按钮坐标
enterRoomY=0
quitRoomX=0 #确认退出按钮坐标
quitRoomY=0

read -p "选择机型:1(华为M2平板),2(小米平板2),3(Nexus5),4(红米2A) 默认2  :" phone
if [ "$phone" = "1" ] || [ ! -n "$phone" ];then
    echo "当前选中机型:华为M2平板"
    enterRoomX=400
    enterRoomY=500
    quitRoomX=1300
    quitRoomY=610
elif [ "$phone" = "2" ];then
    echo "当前选中机型:小米平板2"
    enterRoomX=400
    enterRoomY=640
    quitRoomX=1480
    quitRoomY=820
elif [ "$phone" = "3" ];then
    echo "当前选中机型:Nexus5"
    enterRoomX=200
    enterRoomY=900
    quitRoomX=1200
    quitRoomY=610
elif [ "$phone" = "4" ];then
    echo "当前选中机型:红米2A"
    enterRoomX=200
    enterRoomY=600
    quitRoomX=1000
    quitRoomY=410
else
    echo "错误:未知机型"
    exit 0
fi

read -p "是否测试学生端进入教室?默认是(y/n)  :" isStudent
if [ "$isStudent" = "y" ] || [ ! -n "$isStudent" ];then
    echo "即将测试学生端"
elif [ "$isStudent" = "n" ];then
    enterRoomX=$(($enterRoomX + 400))  #数据量少的课程、
    echo "即将测试旁听端"
else
    echo "输入错误"
    exit 0
fi

echo "开始自动化进出教室"
num=1
while [ "1" = "1" ] #死循环
do
    time=$(date +%m-%d--%H:%M:%S)
    echo "时间:$time$num 次进入教室"
    num=$(($num + 1)) 
    adb shell input tap $enterRoomX $enterRoomY #进入教室
    sleep $quitTime #进教室休眠时间
    adb shell input keyevent 4 #退出教室
    sleep 1
    adb shell input tap $quitRoomX $quitRoomY #退出教室确认
    sleep 4 
done

参考

自己动手开发安卓版按键精灵

Shell 脚本语法

以上是关于求问 BAT脚本如何自动执行 adb shell 以后的命令的主要内容,如果未能解决你的问题,请参考以下文章

python(或BAT脚本)自动执行adb shell以后的命令

躺平了,三分钟学bat脚本adb shell 执行命令 + bat脚本延时操作

✈躺平了,三分钟学bat脚本✈adb shell 执行命令 + bat脚本延时操作

Bat脚本yes和回车执行方法?

Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试

Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试