批处理脚本识别多安卓设备

前言

手机软件测试工作,很多时候都需要adb 连接手机执行一些操作,只连接一台手机还好,但是要连接多个手机同时执行一些操作,比如monkey,压力操作时,就比较麻烦

多设备连接的方法

目前实现多设备的连接方法有,但是操作都比较麻烦,操作方法如下:

一、手工指定设备号

1、先输入adb devices 获取设备号:

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也启用延时
n启用延时
skip不支持将n启用延时????,搜索了下,果然如此。。。(在此感叹批处理的鬼斧神工~~~~)

不过黄天不负有心人,还是找到了办法

使用call语句,调用返回值
done
完美得到每台设备的序列号!!

结束语

代码实际不复杂,但是可以在后续使用中增加很大的方便,我目前可以使用这套方法,同时给多个手机进行压力测试和monkey测试,更多技巧等待各路大神指教!

posted @ 2023-02-02 13:58  小~鹿先森  阅读(191)  评论(0编辑  收藏  举报