ADB导出文件脚本

@echo off
setlocal enabledelayedexpansion
title ADB导出文件脚本
color 0A
REM ========== 配置区域 ==========
set "default_file=log_large_data.txt"  REM 默认文件名
set "common_dirs=/storage/emulated/0 /sdcard /data"  REM 常用搜索目录
set "extended_dirs=/dev /sys /mnt /vendor /bin /etc /system"  REM 扩展搜索目录
set "desktop_path=%USERPROFILE%\Desktop"
set "timeout_seconds=10"
set "enable_full_search=1"  REM 是否启用全盘搜索功能 (1=启用, 0=禁用)
REM =============================

echo.
echo 正在执行ADB文件搜索与拉取任务...
echo.

REM 检查ADB是否可用
where adb >nul 2>nul
if %errorlevel% neq 0 (
    echo 错误:未找到ADB命令,请确保:
    echo 1. Android SDK已安装
    echo 2. ADB路径已添加到系统环境变量
    echo.
    pause
    exit /b 1
)

REM 检查设备连接
echo 正在检测连接的Android设备...
adb devices | findstr /r /c:"^[^List].*device$" >nul
if %errorlevel% neq 0 (
    echo 错误:未找到已授权的Android设备
    echo 请确保:
    echo 1. 设备已通过USB连接电脑
    echo 2. 已开启USB调试模式
    echo 3. 设备上已授权此电脑的调试请求
    echo.
    echo 将在%timeout_seconds%秒后重试...
    timeout /t %timeout_seconds% /nobreak >nul
    adb devices | findstr /r /c:"^[^List].*device$" >nul
    if %errorlevel% neq 0 (
        echo 错误:设备连接失败,请检查后重试
        echo.
        pause
        exit /b 1
    )
)

REM 获取用户输入的文件名
echo.
set /p "user_input=请输入要搜索的文件名(支持模糊查询,用英文单引号包裹进行精确匹配,回车使用默认文件 '%default_file%'): "

REM 处理用户输入
if "!user_input!"=="" (
    set "search_pattern=%default_file%"
    set "search_type=精确匹配"
) else (
    REM 检查是否用单引号包裹(精确匹配)
    if "!user_input:~0,1!!user_input:~-1!"=="''" (
        REM 精确匹配模式
        set "search_pattern=!user_input:~1,-1!"
        set "search_type=精确匹配"
    ) else (
        REM 模糊匹配模式
        set "search_pattern=*!user_input!*"
        set "search_type=模糊匹配"
    )
)

REM 确保搜索模式不为空
if "!search_pattern!"=="" (
    echo 错误:搜索模式为空,请重新输入文件名
    pause
    exit /b 1
)

REM 搜索目标文件 - 第一阶段(常用目录)
echo.
echo 正在常用目录搜索文件 [!search_type!]: !search_pattern!
echo 搜索目录: %common_dirs%
echo.

set "device_file="
set "file_count=0"

REM 使用find命令搜索文件
for /f "tokens=*" %%i in ('adb shell find %common_dirs% -type f -name "!search_pattern!" 2^>nul') do (
    set /a "file_count+=1"
    set "device_file=%%i"
    echo 找到文件 [!file_count!]: %%i
)

REM 第二阶段:扩展目录搜索(如果常用目录没找到)
if %file_count% equ 0 (
    echo.
    echo 未在常用目录找到文件,正在扩展目录搜索...
    echo 搜索目录: %extended_dirs%
    echo.
    
    for /f "tokens=*" %%i in ('adb shell find %extended_dirs% -type f -name "!search_pattern!" 2^>nul') do (
        set /a "file_count+=1"
        set "device_file=%%i"
        echo 找到文件 [!file_count!]: %%i
    )
)

REM 第三阶段:全盘搜索(如果前两个阶段都没找到)
if %enable_full_search% equ 1 if %file_count% equ 0 (
    echo.
    echo 未在扩展目录找到文件,是否进行全盘搜索?
    echo 警告:全盘搜索可能需要较长时间(1-5分钟)
    set /p "full_search=是否继续?(Y/N): "
    
    if /i "!full_search!"=="Y" (
        echo.
        echo 正在全盘搜索文件 [!search_type!]: !search_pattern!
        echo 搜索目录: / (整个设备)
        echo.
        
        REM 全盘搜索(不进行任何过滤)
        for /f "tokens=*" %%i in ('adb shell find / -type f -name "!search_pattern!" 2^>nul') do (
            set /a "file_count+=1"
            set "device_file=%%i"
            echo 找到文件 [!file_count!]: %%i
        )
    )
)

if %file_count% equ 0 (
    echo.
    echo 错误:未找到匹配文件
    echo 搜索模式: !search_pattern! [!search_type!]
    echo 可能原因:
    echo 1. 文件名输入错误
    echo 2. 文件不在设备上
    echo 3. 设备存储空间不足
    echo.
    pause
    exit /b 1
)

REM 如果找到多个文件,让用户选择
if %file_count% gtr 1 (
    echo.
    set /p "file_index=找到多个匹配文件,请输入要拉取的文件编号 (1-%file_count%): "
    
    REM 验证输入
    if !file_index! lss 1 (
        echo 错误:输入编号太小
        pause
        exit /b 1
    )
    if !file_index! gtr %file_count% (
        echo 错误:输入编号太大
        pause
        exit /b 1
    )
    
    REM 获取选择的文件路径
    set "counter=0"
    
    REM 重新执行搜索命令以获取文件列表
    if %file_count% leq 10 (
        REM 如果是常用或扩展目录找到的文件
        for /f "tokens=*" %%i in ('adb shell find %common_dirs% %extended_dirs% -type f -name "!search_pattern!" 2^>nul') do (
            set /a "counter+=1"
            if !counter! equ !file_index! (
                set "device_file=%%i"
            )
        )
    ) else (
        REM 如果是全盘搜索找到的文件
        for /f "tokens=*" %%i in ('adb shell find / -type f -name "!search_pattern!" 2^>nul') do (
            set /a "counter+=1"
            if !counter! equ !file_index! (
                set "device_file=%%i"
            )
        )
    )
)

echo.
echo 已选择文件: %device_file%
echo.

REM 获取文件大小(设备端)
echo 正在获取文件信息...
for /f "tokens=*" %%i in ('adb shell stat -c "%%s" "%device_file%" 2^>nul') do set "file_size=%%i"
if "!file_size!"=="" (
    for /f "tokens=*" %%i in ('adb shell ls -l "%device_file%" 2^>nul ^| awk "{print \$5}"') do set "file_size=%%i"
)

REM 显示文件信息
echo 文件信息:
echo 路径:%device_file%
if not "!file_size!"=="" (
    echo 大小:!file_size! 字节
)

REM 确认操作
echo.
set /p "confirm=是否继续拉取文件?(Y/N): "
if /i not "!confirm!"=="Y" (
    echo 操作已取消
    echo.
    pause
    exit /b 0
)

REM 执行文件拉取
echo.
echo 正在拉取文件到桌面...
adb pull "%device_file%" "%desktop_path%"

REM 结果处理
if %errorlevel% equ 0 (
    echo.
    echo ========== 操作成功 ==========
    echo √ 文件拉取成功!
    
    REM 获取本地文件名
    for %%F in ("%device_file%") do set "local_file=%%~nxF"
    
    echo 保存位置:%desktop_path%\!local_file!
    
    REM 显示本地文件大小
    for %%F in ("%desktop_path%\!local_file!") do (
        echo 文件大小:%%~zF 字节
    )
    
    echo.
    echo 任务完成!您可以:
    echo 1. 按任意键打开桌面查看文件
    echo 2. 直接关闭窗口
    
    echo.
    pause
REM    echo 正在打开桌面...
REM    start "" "%desktop_path%"
) else (
    echo.
    echo ========== 操作失败 ==========
    echo × 文件拉取失败!错误代码:%errorlevel%
    echo 可能原因:
    echo 1. 设备断开连接
    echo 2. 文件传输中断
    echo 3. 磁盘空间不足
    echo.
    pause
)

endlocal
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容