求问 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脚本运行时,是在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
参考
以上是关于求问 BAT脚本如何自动执行 adb shell 以后的命令的主要内容,如果未能解决你的问题,请参考以下文章
python(或BAT脚本)自动执行adb shell以后的命令
躺平了,三分钟学bat脚本adb shell 执行命令 + bat脚本延时操作
✈躺平了,三分钟学bat脚本✈adb shell 执行命令 + bat脚本延时操作