前言
手机软件测试工作,很多时候都需要adb 连接手机执行一些操作,只连接一台手机还好,但是要连接多个手机同时执行一些操作,比如monkey,压力操作时,就比较麻烦
多设备连接的方法
目前实现多设备的连接方法有,但是操作都比较麻烦,操作方法如下:
一、手工指定设备号
1、先输入adb devices 获取设备号:
adb devices
终端窗口会显示已经连接的设备
2、使用adb -s [设备号] xxx 指定设备进行操作
这样确实可以进行指定设备连接后,进行操作,但是比较麻烦,而且当处理事件比较多的时候,这得操作到啥时候,比如:进行5台手机logcat日志记录
二、写成批处理文件,手动填入设备号
例如:我需要获取5台设备上安装的第三方包名,那该怎么操作呢?
如下:
@echo off
adb devices
set /p dev1="请输入设备号1:"
set /p dev2="请输入设备号2:"
set /p dev3="请输入设备号3:"
set /p dev4="请输入设备号4:"
set /p dev5="请输入设备号5:"
adb -s %devl% shell pm list package -3 >d:\package.txt
adb -s %dev2% shell pm list package -3 >>d:\package.txt
adb -s %dev3% shell pm list package -3 >>d:\package.txt
adb -s %dev4% shell pm list package -3 >>d:\package.txt
adb -s %dev5% shell pm list package -3 >>d:\package.txt
echo done
pause
实际使用会发现,代码冗余,不实用
三、自动实现设想
我们是否可以考虑,自动识别到连接到电脑的手机有多少台?然后自动分配设备号到一个变量,然后每次调用adb -s [设备号]时,自动换成对应的设备号?
1、获取连接上的设备个数
使用adb devices 可以得到每台设备的连接状态,那么就可以从返回值中获取到设备个数
例如:现在已经连接两台设备,使用adb devices读取,并输出到文本,就能得到以下文本内容:
List of devices attached
3fb371d3 device
7bd3c84d device
代码实现:
adb devices >devices.txt
#将连接上的设备输出到一个文本
for /f "tokens=2 delims=:" %%a in ('find /c /v "" devices.txt')do set/a result=%%a
#从文本中读取行数,并赋值给result
set /a num =%result%-1
#由于会把 List of devices attached 也存入文档中,所以行数应该-1
最后num的值就是设备的个数
2、继续从devices文档中获取设备号
当知道设备个数后,我们需要将每个设备的序列号,都取出来,设想有多少设备,就执行赋值设备多少次,可以用一个for 循环进行读取每一行的第一个字段,首次读取,需要跳过文本中的首行,也就是“List of devices attached” 这一行,而且每次读取一行后,第二次读取都需要跳过已经读取过的的那一行
设想始终是设想,时间才是检验真理的唯一标准,开始干!!
代码实现:
set /a n=1
#首先跳过第一行,设置跳过首行
for /l %%i in (1,1,%num%) do (
#有多少设备就循环多少次(%num%值是上面代码取到的设备个数)
for /f "skip=%n%" %%j in (devices.txt) do (set devices=%%j)
echo %devices%
#每次循环看下读取到的devices是什么
set /a n +=1
#每次读取后都跳过+1行
)
运行后发现,终端显示 ‘ECHO 处于关闭状态。’,这是为什么呢,我们把%%j都显示出来看看
for /l %%i in (1,1,%num%) do (
for /f "skip=%n%" %%j in (devices.txt) do (
set devices=%%j
echo %%devices
)
echo %devices%
set /a n +=1
)
终端显示:
这是什么鬼?这不是我们想要的结果,翻阅了很多资料,终于找到了原因所在:
批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。在不启用变量延迟,也不对变量动态捕获其扩展变化时,变量在预处理阶段不作改变
setlocal enabledelayedexpansion ,就是启用变量延迟,我们可以形象的认为是启用了“对变量动态捕获扩展变化”。而 ! 括起来的变量,就是要动态捕获扩展的目标变量,如果不需要,可以继续使用 % 括变量。
再尝试使用了变量延迟后的效果:
发现只能读取到最后一个设备的序列号,检查下,还是变量延时的问题,skip=%n%,如果不启动延时,那么n只能取到最新的一个值,需要将n也启用延时
skip不支持将n启用延时????,搜索了下,果然如此。。。(在此感叹批处理的鬼斧神工~~~~)
不过黄天不负有心人,还是找到了办法
使用call语句,调用返回值
完美得到每台设备的序列号!!
结束语
代码实际不复杂,但是可以在后续使用中增加很大的方便,我目前可以使用这套方法,同时给多个手机进行压力测试和monkey测试,更多技巧等待各路大神指教!
标签:set,多安卓,package,批处理,devices,%%,adb,识别,设备 From: https://www.cnblogs.com/deer-xiansen/p/17085791.html