[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理FOR循环一段时间后出错,前面却没问题

  1. @echo off
  2. ::adb临时加入到path环境变量
  3. set My_PATH=.\SDK\adb
  4. set PATH=%PATH%;%My_PATH%
  5. md .\bak\ 2>nul
  6. setlocal enabledelayedexpansion
  7. ::列出已装的app
  8. for /f "usebackq delims=:== tokens=2,3,4" %%i in (`adb shell pm list packages -f -3`) do (
  9. if "%%k"=="" (set P=%%j) else (set P=%%k)
  10. for %%i in (.\bak\*!P!.apk) do (
  11. echo !P!
  12. for /f tokens^=6^ delims^=^' %%a in ('.\SDK\aapt2\aapt2.exe dump badging %%i 2^>nul
  13. ^|findstr /c:"versionName"') do set A=%%a
  14. )
  15. ECHO 123
  16. )
  17. pause
复制代码
com.miv.rtmpcamera
123
cn.xiaochuankeji.tieba
123
com.lgh.accessibilitytool
123
com.ihewro.android_expression_package
123
com.homelink.android
123
net.duohuo.magapp.jysq
123
org.telegram.messenger
123
com.tencent.tmgp.sgame
123
com.teslacoilsw.launcher
123
com.yizhe_temai
123
web1n.stopapp
123
com.sankuai.meituan
123
air.tv.douyu.android
123
com.kumobius.android.duet
123
bos.consoar.imagestitch
123
org.isoron.uhabits
123
com.keramidas.TitaniumBackup
123
com.sky.xposed.rimet
123
jp.pxv.android
123
com.dmzj.manhua
123
com.tencent.gamehelper.smoba
123
eu.thedarken.sdm.unlocker
123
com.microsoft.office.excel
123
moe.shizuku.privileged.api
123
com.realbyteapps.moneymanagerfree
123
in.zhaoj.shadowsocksr
123
net.dinglisch.android.taskerm
123
com.tencent.mm
123
123
123
com.sankuai.meituan.takeoutnew
123
com.xiaomi.jr
123
123
123
123
123
123
123
123
com.zhaopin.social
123
123
123
123
dkplugin.ylg.mux
123
com.tencent.djcity
123
123
com.aboutjsp.thedaybefore
123
com.omarea.vtools
123
com.google.zxing.client.android
123
123
com.pp.assistant
123
org.meowcat.edxposed.manager
123
de.telekom.tsc
123
123
com.estrongs.android.pop
123
com.tencent.tgclub
123
123
com.xunmeng.pinduoduo
123
com.rarlab.rar
123
123
com.enniu.fund
123
123
com.android.app.quanmama
123
com.findtheway
123
123
com.slowlyapp
123
com.softbank.mbank.xy.gafz
123
com.tencent.mobileqq
123
123
123
123
com.topjohnwu.magisk
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
123
com.jingdong.app.mall
123
123
com.android.calculator2
123
123
123
123
123
123
123
123
123
com.iflytek.inputmethod
123
123
123
123
123
123
123
123
123
123
123
123
123
123
com.taobao.taobao
123
123
123
123
123
123
123
123
123
123

来个大佬。。。

TOP

看你代码,是因为备份文件夹下不存在以当前包名结尾的apk文件
for %%i in (.\bak\*!P!.apk) do (
                echo !P!
...
)
所以只会输出123,也就是你当前包名对应的apk并没有备份
1

评分人数

TOP

回复 3# went


    如果是不存在apk,那么前面又为什么成功

TOP

本帖最后由 hentai87 于 2020-7-19 20:25 编辑

回复 3# went


    好像确实是这样,但原问题bat不是这个,为了方便问问题简化过了
没有文件也能备份,但仅限前面部分和后面的一小步
  1. @echo off
  2. ::adb临时加入到path环境变量
  3. set My_PATH=.\SDK\adb
  4. set PATH=%PATH%;%My_PATH%
  5. md .\bak\ 2>nul
  6. setlocal enabledelayedexpansion
  7. ::列出已装的app
  8. for /f "usebackq delims=:== tokens=2,3,4" %%i in (`adb shell pm list packages -f -3`) do (
  9. if "%%k"=="" (set P=%%j) else (set P=%%k)
  10. for /f tokens^=2^ delims^=^= %%a in ('adb shell dumpsys package !P! 2^>nul ^|findstr versionName') do set B=%%a
  11. for %%i in (.\bak\*!P!.apk) do (
  12. echo %%i
  13. echo !P!
  14. for /f tokens^=6^ delims^=^' %%a in ('.\SDK\aapt2\aapt2.exe dump badging %%i 2^>nul
  15. ^|findstr /c:"versionName"') do set A=%%a
  16. )
  17. ECHO !P!_!B!→!A!
  18. if "!B!" GTR "!A!" (
  19. del .\bak\*!P!.apk 2>nul
  20. for /f tokens^=4^ delims^=^= %%a in ('adb shell dumpsys package !P! 2^>nul^|findstr targetSdk') do set C=%%a
  21. if "%%k"=="" (adb pull %%i .\bak\API_!C!_%%j.apk >nul|ECHO 已备份) else (adb pull %%i==%%j .\bak\API_!C!_%%k.apk >nul|ECHO 已备份)
  22. ) else (
  23. echo 不需要更新
  24. )
  25. )
  26. pause
复制代码

TOP

本帖最后由 hentai87 于 2020-7-19 20:49 编辑

回复 5# hentai87


    解决了,是。。换行的问题
但是还是没好,对已备份的apk,版本识别有时会停留在上个apk,上个apk是1.2,下个也是1.2
输出
com.flyersoft.moonreaderp_4.5.7→4.5.7
com.zhaopin.social_7.9.51→4.5.7[code]@echo off

TOP

回复 6# hentai87


    似乎也是因为没有文件造成没有设置版本号,但是有的就能成功,我删光apk了,有的还是备份成功了

TOP

你5楼代码15行上面初始化一下版本
set "A=0"
for %%i in (.\bak\*!P!.apk) do (
                echo !P!
...."set A=%%a"
)

TOP

回复 8# went


    厉害。我还想着加个检测文件是否存在试一试的,你这样快多了

TOP

不要使用versionName来判断版本新旧,很容易出错,版本号会含有很多字符和字母
比如1.9.1和1.10.1会判断错误
用versionCode来判断,每个新版本apk都会增加版本代码,而且是纯数字,直接比较大小

TOP

载过跟头,总结出来的经验
另外保存的文件名也可以优化一下

TOP

返回列表