批处理在日常工作的应用(一)
概述
本系列文章主要介绍批处理在日常工作中的应用,具体的语法不作介绍,网上有很多这方面的博客,以下推荐几个:
本篇文章主要介绍adb和批处理结合解决平时工作上的问题。
一、通过adb安装apk
对于android开发和测试的小伙伴来说,安装apk很是常见的,我们可以通过批处理来做这件事。不过你们肯定问会说,这个有啥麻烦的,一个adb install xxx.apk 搞定,但有时候情况并不是,举个最常见的例子:平时一台电脑可能连了多个android设备,这时候你要安装的话,要不拔掉不用的,只保留一个需要安装的设备,要不通过-s 命令参数指定一台需要安装的android设备,但感觉都挺麻烦。有时候安装apk的时候需要查看这个apk版本和包名,可以通过:
aapt d badging xx.apk
查出版本号和包名称,这时候我们可以考虑将这两个功能合在一起,既能看版本又能方便安装。
首先想到的是批处理,因为批处理在win系统上天然支持,只要写好这个脚本就可以帮你做很多事,而且不需要像java,python一样安装运行环境。
1. apk安装脚本代码
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set devs=
set num=0
set select=
set devname=
set packname=
set newVersionName=
echo ==================== 当前连接的设备 ====================
rem 获取版本信息
for /f "tokens=2,3,4" %%a in ('aapt d badging %1') do (
set /a n+=1
if !n!==1 (
echo 应用名称: %~n1%~x1 %%a
echo 应用版本: %%b %%c
set newVersionName=%%c
for /f "tokens=2 delims=^=" %%i in ("%%a") do set packname=%%i
)
)
rem 获取当前连接的设备
echo.
for /f "skip=1" %%a in ('adb devices') do (
set dev=%%a
if not "!devs!"=="" (
set "devs=!devs!,!dev!"
) else (
set "devs=!devs!!dev!"
)
set /a num+=1
rem 获取设备名称
for /f "delims=," %%i in ('adb -s !dev! shell getprop ro.product.model') do set devname=%%i
rem 显示可选设备
echo 设备: !num! !dev! !devname!
)
echo ==================== 当前连接的设备 ====================
echo.
rem 如果只有一个设备,直接安装
if !num! equ 1 (
set select=!devs!
goto :install
)
rem 如果有多个设备选择一个设备进行安装
set /p num=选择一个设备进行安装(选择序号):
for /f "delims=, tokens=%num%" %%i in ("!devs!") do set select=%%i
goto :install
:install
echo.
set versionName=
for /f "delims=" %%i in ('adb -s !select! shell dumpsys package !packname! ^| findstr versionName') do (
set versionName= %%i
)
if "%versionName%" neq "" (
echo 版本升级: %versionName% --^> %newVersionName%
)
rem 开始安装
echo.
echo 正在安装..., 待安装的设备: !select!
if "%~d1" == "\\" (
adb -s !select! install -r -d %1
) else (
rem 进入相应目录,避免特殊目录导致安装失败问题
cd %~dp1
adb -s !select! install -r -d %~nx1
)
pause
2. 代码介绍
代码逻辑还是比较清晰的,从上到下主要分3个部分,第一部分通过aapt解析apk获取版本号和包名称。第二部分通过adb devices命令获取当前连接的设备,第三部分是apk安装命令。需要注意的是,adb install对于一些中文目录不支持,安装回报错,需要先进入这个目录后开始安装。但类似共享目录这种就不能这样,只能按照路径进行安装,所以安装部分代码拆成两个逻辑实现。代码注释也比较清楚了,详细的不介绍了,可以对比注释理解这段脚本代码。
3. 怎么应用这个批处理
代码都是实现了,但怎么和apk进行关联呢,我们知道一个文件可以指定他的打开方式,bat处理也可以看成是一个程序。那依次类推是不是我们可以指定apk打开方式为批处理。这样我们就可以直接双击这个apk就能安装了。
我们新建一个后缀为 .bat 的install_apk.bat文件,这个批处理文件你就当成一个软件放到一个文件夹下,这时候如下图1-1 指定打开方式为 install_apk.bat。指定打开方式完成后,这时候直接双击apk就能安装了。
![](https://img.haomeiwen.com/i716174/d33d95e1fb895345.png)
双击后如下图所示:
![](https://img.haomeiwen.com/i716174/39d4b93f57be4f26.png)
是不是很方便,只要双击apk就能安装,不需要再去敲命令,就能帮你安装又能查看apk安装的信息,甚至看到安装在android设备的上个版本号信息。
二、通过adb截屏
这个也是很常见的应用,平时的时候需要敲至少两行命令才行,
第一步截图保存到sd卡中:
adb shell /system/bin/screencap -p /sdcard/screen.png
第二步copy sd卡中保存的图片到电脑端
adb pull /sdcard/screen.png C:/Users/%username%/Desktop/screen.png
通过批处理进行组合我们能更高效的完成,只要点点鼠标就行。
1. 代码实现
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set devs=
set num=0
set select=
set devname=
for /f "skip=1" %%a in ('adb devices') do (
set dev=%%a
if not "!devs!"=="" (
set "devs=!devs!,!dev!"
) else (
set "devs=!devs!!dev!"
)
set /a num+=1
rem 获取设备名称
for /f "delims=," %%i in ('adb -s !dev! shell getprop ro.product.model') do set devname=%%i
rem 显示可选设备
echo 设备: !num! !dev! !devname!
)
echo ==================== 当前连接的设备 ====================
echo.
if !num! equ 1 (
set select=!devs!
goto :shot2
)
set /p num=选择一个设备进行安装(选择序号):
for /f "delims=, tokens=%num%" %%i in ("!devs!") do set select=%%i
goto :shot2
:shot2
echo ------^>正在截图...
adb -s !select! shell /system/bin/screencap -p /sdcard/screenshot.png
if !errorlevel! equ 1 goto :fail
echo ------^>正在复制图片到桌面
adb -s !select! pull /sdcard/screenshot.png C:/Users/%username%/Desktop/screenshot.png > Nul
if !errorlevel! equ 1 goto :fail
echo ------^>截图成功
goto :end
:fail
echo ------^>截图失败!!
:end
echo.
pause
2. 代码介绍
主要也分三个部分,第一部分选择设备,第二部分截图,第三部分copy图片到电脑桌面。第一部分是直接拿上面安装脚本代码的。当然了,像这种共用的模块可以封装成一个函数供其他模块调用。我偷了个懒直接拿来用了。
3. 应用
应用么,很简单,双击这个写好的批处理即可。
总结
上面介绍的2个只是我平时遇到比较多的例子,还有许多其他应用,需要各位大大去挖掘,肯定还有许多我还没发现的,各位都可以提提意见,共同进步哈。上面有啥错误,也欢迎指正。下篇介绍其他的应用。