下面我将从基础到高级,详细讲解如何在 .bat 文件中使用 adb 命令。

前提条件:环境变量配置
在批处理脚本中直接使用 adb 命令,有一个最重要的前提:adb.exe 所在的路径需要被添加到系统的环境变量 PATH 中。
如果未添加,你需要在脚本中指定 adb.exe 的完整路径,这会使脚本变得不灵活(比如在不同电脑上可能失效)。
如何检查并配置环境变量?
-
检查:打开命令提示符(CMD),输入
adb version并回车。
(图片来源网络,侵删)- 如果能看到版本信息,说明环境变量已配置正确。
- 如果提示
'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件,说明需要配置。
-
配置:
- 右键点击“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
- 在“系统变量”中找到
Path变量,双击它。 - 点击“新建”,然后将
adb.exe所在的文件夹路径添加进去,通常是SDK\platform-tools这个路径。C:\Users\你的用户名\AppData\Local\Android\Sdk\platform-tools。 - 一路点击“确定”保存设置。
- 重要:保存后,需要重新打开一个新的 CMD 窗口,环境变量才会生效。
基础用法:直接执行命令
最简单的方式,就像在命令行里一样直接写命令。
示例 1:test_adb.bat
@echo off echo 正在检查设备连接... adb devices echo. echo 正在获取设备型号... adb shell getprop ro.product.model pause
代码解释:

@echo off:关闭命令回显,这样执行脚本时,不会显示adb devices这条命令本身,只会显示命令的输出结果,使界面更整洁。echo ...:在屏幕上输出一行文字。adb devices:经典的adb命令,列出已连接的设备。adb shell getprop ro.product.model:进入adb shell,并执行getprop命令获取设备的型号。pause:脚本执行完毕后会暂停,等待用户按任意键后才关闭窗口,这对于调试非常有用,否则窗口会一闪而过。
高级用法:处理变量和逻辑
批处理脚本真正的强大之处在于它可以使用变量、判断和循环。
示例 2:获取并使用变量
我们可以将 adb 命令的输出结果保存到一个变量中,然后使用它。
get_device_info.bat
@echo off
setlocal
:: 1. 获取设备序列号并保存到变量
for /f "tokens=1" %%i in ('adb devices ^| find "device$"') do (
set "DEVICE_SERIAL=%%i"
)
:: 2. 检查是否成功获取到设备
if "%DEVICE_SERIAL%"=="" (
echo 错误:未找到已连接的设备。
pause
exit /b 1
)
echo 已找到设备: %DEVICE_SERIAL%
echo.
:: 3. 使用变量执行命令
echo 正在获取设备型号...
adb -s %DEVICE_SERIAL% shell getprop ro.product.model
echo.
echo 正在获取 Android 版本...
adb -s %DEVICE_SERIAL% shell getprop ro.build.version.release
endlocal
pause
代码解释:
setlocal和endlocal:定义一个局部作用域,在setlocal和endlocal之间设置的变量(如DEVICE_SERIAL),在脚本结束后会自动清除,不影响系统环境。for /f "tokens=1" %%i in ('adb devices ^| find "device$"') do (...):这是批处理中非常强大的循环结构。adb devices:列出设备。^|:管道符,在批处理中, 是特殊字符,需要用^进行转义。find "device$":过滤adb devices的输出,只找到以device结尾的行(即已授权的设备)。for /f会循环处理find命令的每一行输出。tokens=1表示只取每行的第一个“词”(即设备序列号)。%%i是循环变量,将序列号赋值给它。set "DEVICE_SERIAL=%%i"将循环变量%%i的值保存到我们自己的变量DEVICE_SERIAL中。
if "%DEVICE_SERIAL%"=="" (...):判断变量是否为空,如果为空,说明没有设备连接,则报错并退出。adb -s %DEVICE_SERIAL% ...:-s参数用于指定要操作的设备序列号,当连接多个设备时,这个参数至关重要。
示例 3:循环执行操作
假设你要安装多个 .apk 文件。
install_apps.bat
@echo off
setlocal
:: 假设所有的 APK 文件都在当前脚本的 "apks" 文件夹下
set "APK_DIR=apks"
:: 检查目录是否存在
if not exist "%APK_DIR%" (
错误:找不到 "%APK_DIR%" 文件夹。
pause
exit /b 1
)
echo 正在扫描 %APK_DIR% 文件夹...
echo.
:: 循环遍历文件夹下的所有 .apk 文件
for %%f in ("%APK_DIR%\*.apk") do (
echo 正在安装: %%~nxf
adb install "%%f"
echo.
)
echo 所有安装任务完成。
endlocal
pause
代码解释:
for %%f in ("%APK_DIR%\*.apk") do (...):这是另一个循环,用于遍历文件。"%APK_DIR%\*.apk":表示apks文件夹下所有以.apk结尾的文件。%%f在每次循环中代表一个完整的文件路径(如apks\app1.apk)。%%~nxf:这是%%f的一个修饰符,~nx表示只提取文件的名称和扩展名(如app1.apk),方便在日志中显示。adb install "%%f":将遍历到的 APK 文件路径作为参数传递给adb install命令,注意文件路径最好用引号括起来,以防路径中包含空格。
错误处理
在自动化脚本中,处理错误非常重要。adb 命令执行失败时,通常会返回一个非零的退出码,我们可以用 errorlevel 来判断。
safe_install.bat
@echo off
setlocal
set "APP_TO_INSTALL=my_app.apk"
if not exist "%APP_TO_INSTALL%" (
echo 错误:找不到要安装的文件 "%APP_TO_INSTALL%"。
pause
exit /b 1
)
echo 正在安装 %APP_TO_INSTALL%...
adb install "%APP_TO_INSTALL%"
:: 检查上一条命令的执行结果
if %errorlevel% neq 0 (
echo.
echo 安装失败!请检查设备连接或 APK 文件。
exit /b 1
) else (
echo.
echo 安装成功!
)
endlocal
pause
代码解释:
if %errorlevel% neq 0:errorlevel是一个内置变量,存储了上一条命令的退出码。0表示成功,非0表示失败。neq表示 "not equal"(不等于)。adb install失败,脚本会打印错误信息并以错误码1退出。
常见问题与技巧
问题 1:提示“adb 不是内部或外部命令...”
原因:环境变量 PATH 未配置或配置不正确。
解决:请务必参考第 1 节,正确配置环境变量,并重新打开一个新的 CMD 窗口来运行脚本。
问题 2:adb devices 输出有 unauthorized
原因:电脑上从未信任过这个设备的 ADB 调试。 解决:在手机上弹出的“允许 USB 调试”对话框中勾选“始终允许”,然后点击“确定”。
问题 3:如何在脚本中模拟按键操作?
使用 adb shell input 命令。
:: 模拟按 Home 键 adb shell input keyevent KEYCODE_HOME :: 模拟按返回键 adb shell input keyevent KEYCODE_BACK :: 模拟输入文本 "hello world" adb shell input text "hello world" :: 模拟点击屏幕坐标 (500, 1200) adb shell input tap 500 1200
你可以通过 adb shell getevent 或开发者选项中的“指针位置”来获取屏幕坐标。
问题 4:如何高效调试脚本?
- 使用
echo:在关键步骤前后使用echo命令打印变量值或状态信息,确认脚本是否按预期执行。 - 分段测试:将复杂的脚本拆分成多个小
.bat文件,逐个测试其功能是否正常。 - 查看日志:
adb命令失败,可以尝试在命令行手动执行该命令,观察完整的错误输出,这有助于定位问题。
通过以上这些方法,你就可以在批处理脚本中灵活、强大地执行各种 adb 命令,实现复杂的自动化任务了。
