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

[文本处理] 不用临时文件怎么比较2个for结果的差异

本帖最后由 hentai87 于 2020-7-19 22:09 编辑

脚本没问题,就是用到了临时文件1.txt 2.txt,我想不用
  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. ECHO !P!>>1.TXT
  11. for %%i in (.\bak\*!P!.apk) do ECHO !P!>>2.TXT
  12. )
  13. for /f "delims=" %%i in ('findstr /g:2.TXT /v 1.TXT 2^>nul') do echo %%i
  14. del 1.TXT 2>nul
  15. del 2.TXT 2>nul
  16. pause
复制代码

回复 15# hentai87
加个转义符试试(echo %s1%) ^| findsrt %s2%

TOP

回复 31# hentai87

for 中可以给变量添加很多你需要的附加参数,用#分隔
我帮你添加了本地文件路径和远程apk路径,其它的你自由发挥
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 记录已备份的apk
  4. for /f "tokens=1,2* delims=_" %%i in ('dir /b .\bak\*_*_*.apk') do set "#%%~nk=已备份#未安装#%%i_%%j_%%k"
  5. REM 记录已安装的apk
  6. for /f "tokens=1-3* delims=:=" %%i in ('adb shell pm list packages -f -a') do (
  7. if "%%l"=="" (
  8. if "!#%%k!"=="" (
  9. set "#%%k=未备份#已安装#_#%%j"
  10. ) else (
  11. set "#%%i=已备份#已安装!#%%k:~7!#%%j"
  12. )
  13. ) else (
  14. if "!#%%l!"=="" (
  15. set "#%%l=未备份#已安装#_#%%j==%%k"
  16. ) else (
  17. set "#%%i=已备份#已安装!#%%l:~7!#%%j==%%k"
  18. )
  19. )
  20. )
  21. REM 过滤
  22. echo 已备份#未安装:
  23. echo.
  24. for /f "tokens=1-3* delims=#" %%i in ('set # ^| findstr "已备份#未安装"') do (
  25. set "pkgName=%%i"
  26. echo 包名: !pkgName:~0,-4!
  27. echo 文件: .\bak\%%k
  28. echo.
  29. )
  30. echo -----------------------------------------------------
  31. echo 未备份#已安装:
  32. echo.
  33. for /f "tokens=1-3* delims=#" %%i in ('set # ^| findstr "未备份#已安装"') do (
  34. set "pkgName=%%i"
  35. echo 包名: !pkgName:~0,-4!
  36. echo 路径: %%l
  37. echo.
  38. )
  39. echo -----------------------------------------------------
  40. pause&exit
复制代码

TOP

  1. (echo %s1%) | findstr "%s2%"
复制代码
上面的用在for里会出错,下面的可行
  1. for /f  %%i in ('cmd /c "echo %s1%" ^| findstr "%s2%"') do echo %%i
复制代码

TOP

回复 29# went


有个问题,最后到要安装那步。。。前面的api等级未知。。。。又不能adb *%%i.apk

TOP

回复 27# newswan


是可以了,但如何把最后的list 用到命令上呢
比如最后结果是
123
456


adb 123
adb 456

TOP

*表示第二段后面的所有字符,包含分隔符在内的

TOP

回复 25# hentai87
怎么无解了,for你没用熟把
第4行改为
  1. for /f "tokens=1,2* delims=_" %%i in ('dir /b .\bak\*.apk') do set "#%%~nk=已备份#未安装"
复制代码
1

评分人数

TOP

本帖最后由 newswan 于 2020-7-21 20:37 编辑

(echo %s1%) | findsrt %s2%

%s2% 用""括起来

晕,前面的我忘记用引号了。
1

评分人数

TOP

存为2个文件 s1.txt s2.txt
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set _Lf_=^&echo,
  4. for /f %%i in (s1.txt) do (
  5. set s1=!s1!%%i!_Lf_!
  6. )
  7. echo %s1%
  8. for /f %%i in (s2.txt) do (
  9. set "s2=!s2!%%i "
  10. )
  11. echo %s2%
  12. echo,
  13. (echo %s1%) | findstr "%s2%"
复制代码
win10
输出结果为:
com.alibaba.android.rimet
com.estrongs.android.pop
com.iflytek.inputmethod
com.sankuai.meituan.takeoutnew
com.tencent.tmgp.sgame
tv.danmaku.bili
com.autonavi.minimap
com.chinamworld.bocmbci
com.taobao.etao
org.meowcat.edxposed.manager
ccc71.at.free
cn.soulapp.android
cn.wq.myandroidtools
com.coolapk.market
com.eg.android.AlipayGphone
com.findtheway
com.jd.jrapp
com.jingdong.app.mall
com.omarea.vtools
com.sankuai.meituan
com.sdu.didi.psnger
com.tencent.mm
com.tencent.mobileqq
com.topjohnwu.magisk
com.unionpay
com.zhihu.android
eu.thedarken.sdm
eu.thedarken.sdm.unlocker
flar2.exkernelmanager
web1n.stopapp
moe.shizuku.privileged.api
xzr.La.systemtoolbox

TOP

回复 24# hentai87


    = =。
我感觉这个问题无解了,
我还以为_不会被用到的,没想到居然还是又包名用了。。。
我感觉我应该用#打标签。。。。
然后不会又遇到含有#的包名吧。。。。尴尬

TOP

回复 23# went


包名含有_的提取包名失败了
比如API_26_com.ihewro.android_expression_package
被弄成了com.ihewro

TOP

13行以下是过滤条件,可以灵活组合
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 记录已备份的apk
  4. for /f "tokens=3 delims=_" %%i in ('dir /b .\bak\*.apk') do set "#%%~ni=已备份#未安装"
  5. REM 记录已安装的apk
  6. for /f "tokens=2 delims=:" %%i in ('adb shell pm list package -3') do (
  7. if "!#%%i!"=="" (
  8. set "#%%i=未备份#已安装"
  9. ) else (
  10. set "#%%i=已备份#已安装"
  11. )
  12. )
  13. REM 过滤
  14. echo 未安装:
  15. for /f "delims=#=" %%i in ('set # ^| findstr "未安装"') do echo %%i
  16. echo ------------------------
  17. echo 未备份:
  18. for /f "delims=#=" %%i in ('set # ^| findstr "未备份"') do echo %%i
  19. echo ------------------------
  20. echo 已安装:
  21. for /f "delims=#=" %%i in ('set # ^| findstr "已安装"') do echo %%i
  22. echo ------------------------
  23. echo 已备份:
  24. for /f "delims=#=" %%i in ('set # ^| findstr "已备份"') do echo %%i
  25. echo ------------------------
  26. pause&exit
复制代码
1

评分人数

TOP

回复 14# newswan


这样也是闪退,估计真是语句不对
setlocal enabledelayedexpansion
set Lf=^&echo,
for %%i in (123,321,456) do (
                        set "s1=!s1!%%i!Lf!"
)
echo %s1%
for %%i in (123,321) do (
        set "s2=!s2!%%i "
)
echo %s2%
(echo %s1%) | findsrt %s2%
pause

TOP

回复 20# went


我apk名字是api_等级_包名
虽然不知道你怎么做
但估计还是得每次都查询一下api等级吧

TOP

返回列表