Board logo

标题: [文本处理] 不用临时文件怎么比较2个for结果的差异 [打印本页]

作者: hentai87    时间: 2020-7-19 22:04     标题: 不用临时文件怎么比较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
复制代码

作者: newswan    时间: 2020-7-19 23:45

用变量,
set Lf=^&echo,

循环里
set file=!file!%Lf%!P!
作者: hentai87    时间: 2020-7-20 15:19

回复 2# newswan

怎么用到findstr里呢
作者: newswan    时间: 2020-7-20 21:55

echo %file% | findsrt %str%
具体代码,自己
作者: hentai87    时间: 2020-7-20 22:39

回复 4# newswan
setlocal enabledelayedexpansion
set Lf=^&echo,
for %%i in (.\bak\*.apk) do (
set file=!file!%Lf%%%~ni
)
echo %file%
pause


echo %file%结果是
ECHO is off.
%file%估计为空

感觉%file%应该会是 ^&echo,123^&echo,123这样的形势,但实际为空

但是看命令输出,似乎光顾着echo了,没有set 成功
123
123
123
作者: went    时间: 2020-7-20 22:44

是要查找没有备份的包名吗
作者: hentai87    时间: 2020-7-20 22:54

回复 6# went


是的,我已经用if not exist解决了

但是反过来就不行了,【找未安装的备份去安装】
未安装显然不能if not exist,因为不是文件
但是又不存在 for no in 语法
作者: went    时间: 2020-7-20 23:05

可以用dump来查看是否安装了相应的包名
你要在文件名中把包名截取出来
  1. adb shell pm dump com.tencent.mm | findstr /i /C:"Unable to find package" && ( echo 未安装 ) || ( echo 已安装 )
复制代码

作者: newswan    时间: 2020-7-21 00:18

  1.   set file=!file!%%~ni!Lf!
复制代码
Lf 延迟扩展,并且放在 %%i 之后
作者: hentai87    时间: 2020-7-21 11:45

本帖最后由 hentai87 于 2020-7-21 11:51 编辑

对比不出来
  1. setlocal enabledelayedexpansion
  2. set Lf=^&echo,
  3. for %%i in (.\bak\*.apk) do (
  4. for /f "delims=^_ tokens=3" %%A in ("%%i") do (
  5. set file1=!file1!%%~nA!Lf!
  6. )
  7. )
  8. echo %file1%
  9. pause
  10. for /f "usebackq delims=:== tokens=2,3,4" %%i in (`adb shell pm list packages -f -3`) do (
  11. if "%%k"=="" (set P=%%j) else (set P=%%k)
  12. set file2=!file2!!P!!Lf!
  13. )
  14. echo %file2%
  15. pause
  16. echo 未安装有:
  17. echo %file1% | findsrt %file2%
  18. pause
复制代码

作者: hentai87    时间: 2020-7-21 11:54

回复 8# went


    可行,但是每次都adb ,有点慢,还是先对比list吧
作者: newswan    时间: 2020-7-21 14:37

本帖最后由 newswan 于 2020-7-21 14:38 编辑

匹配字符串,不用换行符,用空格分隔,
  1. set "s=!s!!P! "
复制代码
管道之前的命令,加括号
  1. (echo %f%) | findsrt %s%
复制代码

作者: hentai87    时间: 2020-7-21 16:16

回复 12# newswan


看不懂,%s%不是不能用了吗,是!s!吗
%f%又是什么是第二个!s! 吗
闪退 ,出错了
for %%i in (.\bak\*.apk) do (
        for /f "delims=^_ tokens=3" %%A in ("%%i") do (
        set "s1=!s1!%%~nA "
        )
)

for /f "usebackq delims=:== tokens=2,3,4" %%i in (`adb shell pm list packages -f -3`) do (
        if "%%k"=="" (set P=%%j) else (set P=%%k)
        set "s2=!s2!!P! "
)

(echo !s1!) | findsrt !s2!
pause
作者: newswan    时间: 2020-7-21 17:10

  1. for %%i in (.\bak\*.apk) do (
  2.         for /f "delims=^_ tokens=3" %%A in ("%%i") do (
  3.         set "s1=!s1!%%~nA!lf!"
  4.         )
  5. )
  6. for /f "usebackq delims=:== tokens=2,3,4" %%i in (`adb shell pm list packages -f -3`) do (
  7.         if "%%k"=="" (set P=%%j) else (set P=%%k)
  8.         set "s2=!s2!!P! "
  9. )
  10. (echo %s1%) | findsrt %s2%
复制代码
s1 用换行符,s2 用空格
作者: hentai87    时间: 2020-7-21 17:39

回复 14# newswan


依旧闪退
我加了pause查了下,前面echo %s2% echo %s1%  没问题,
(echo %s1%) | findsrt %s2%这句可能有什么错误
s1 用换行符,s2 用空格,没错啊
作者: newswan    时间: 2020-7-21 18:10

输出 s1 s2 看看,里面有空格等特殊符号?
作者: hentai87    时间: 2020-7-21 18:37

回复 16# newswan


wiki.mooncell.app
com.google.zxing.client.android
com.miv.rtmpcamera
com.zhiyoo
com.bilibili.fatego
com.homelink.android
com
dkplugin.ylg.mux
in.zhaoj.shadowsocksr
cn.colg.android
com.alibaba.android.rimet
com.alibaba.android.security.activity
com.baidu.wallet
com.bilibili.comic
com.bly.dkplat
com.cn21.ecloud
com.enniu.fund
com.estrongs.android.pop
com.iflytek.inputmethod
com.ihewro
com.immomo.momo
com.keramidas.TitaniumBackup
com.kuaishou.nebula
com.kumobius.android.duet
com.liqu.app
com.netease.cloudmusic
com.picacomic.fregata
com.pingan.paces.ccms
com.pp.assistant
com.qzone
com.sankuai.meituan.takeoutnew
com.sgcc.wsgw.cn
com.taobao.idlefish
com.taptap
com.tencent.gamehelper.dnf
com.tencent.gamehelper.smoba
com.tencent.tmgp.sgame
com.valvesoftware.android.steam.community
com.xiaomi.router
com
com.zhangdan.app
net.dinglisch.android.taskerm
ru.sxbuIDfx.pFSOyagrF
tv.danmaku.bili
bos.consoar.imagestitch
cn.xiaochuankeji.tieba
com.android.app.quanmama
com.autonavi.minimap
com.chinamworld.bocmbci
com.fbank.mobile
com.sky.xposed.rimet
com.taobao.etao
com.tencent.token
com.xunmeng.pinduoduo
org.meowcat.edxposed.manager
air.tv.douyu.android
ccc71.at.free
cn.garymb.ygomobile
cn.soulapp.android
cn.wq.myandroidtools
com.aboutjsp.thedaybefore
com.android.calculator2
com.antfortune.wealth
com.baidu.netdisk
com.binance.dev
com.cebbank.mobile.cemb
com.coolapk.market
com.cryptobees.mimind
com.dv.adm
com.eg.android.AlipayGphone
com.findtheway
com.flyersoft.moonreaderp
com.greenpoint.android.mc10086.activity
com.habitrpg.android.habitica
com.huanchengfly.tieba.post
com.jd.jrapp
com.jingdong.app.mall
com.joaom**.autonotification
com.keramidas.TitaniumBackupAddon
com.microsoft.office.excel
com.njgdmm.zjy
com.omarea.vtools
com.p1.mobile.putong
com.realbyteapps.moneymanagerfree
com.sankuai.meituan
com.sdu.didi.psnger
com.slowlyapp
com.softbank.mbank.xy.gafz
com.taobao.litetao
com.taobao.taobao
com.teamviewer.quicksupport.market
com.teamviewer.teamviewer.market.mobile
com.tencent.djcity
com.tencent.mm
com.tencent.mobileqq
com.tencent.tgclub
com.tencent.xriver
com.teslacoilsw.launcher
com.topjohnwu.magisk
com.unionpay
com.winterso.markup.annotable
com.wo.voice2
com.workpail.inkpad.notepad.notes
com.xiaomi.jr
com.ymbank.mbank.app
com.zhaopin.social
com.zhihu.android
de.telekom.tsc
eu.thedarken.sdm
eu.thedarken.sdm.unlocker
flar2.exkernelmanager
gov.anzong.androidnga
jp.pxv.android
net.dotpicko.dotpict
net.duohuo.magapp.jysq
org.mozilla.firefox
org.telegram.messenger
web1n.stopapp
cf.playhi.freezeyou
com.accuweather.android
com.dmzj.manhua
com.google.android.apps.nbu.files
com.hily.app
com.lgh.accessibilitytool
com.rarlab.rar
com.setupvpn.main
me.piebridge.brevent
moe.shizuku.privileged.api
org.isoron.uhabits
rikka.appops
xzr.La.systemtoolbox

com.tencent.tmgp.sgame web1n.stopapp com.sankuai.meituan github.tornaco.xposedmoduletest eu.thedarken.sdm.unlocker moe.shizuku.privileged.api com.tencent.mm com.sdu.didi.psnger com.chinamworld.bocmbci com.milecn.milevideo com.omarea.vtools org.meowcat.edxposed.manager com.estrongs.android.pop com.findtheway xzr.La.systemtoolbox com.tencent.mobileqq com.unionpay com.topjohnwu.magisk ccc71.at.free cn.wq.myandroidtools com.zhihu.android com.jd.jrapp com.coolapk.market eu.thedarken.sdm com.jingdong.app.mall com.mmbox.xbrowser com.autonavi.minimap com.alibaba.android.rimet flar2.exkernelmanager com.iflytek.inputmethod cn.soulapp.android tv.danmaku.bili com.eg.android.AlipayGphone com.taobao.etao
作者: went    时间: 2020-7-21 19:05

能否看下你的apk文件命名方式
如果能取出包名,两个for就可以解决
作者: hentai87    时间: 2020-7-21 19:14

回复 18# went


是指你上次说的吗
我成功了啊
for %%i in (.\bak\*.apk) do (
        for /f "delims=^_ tokens=3" %%A in ("%%i") do (
                echo %%~nA
                adb shell pm dump %%~nA | findstr /i /C:"Unable to find package" && ( adb install %%i ) || ( echo 已安装,跳过 )
        )
)

实际执行过程每次就要adb,很慢

如果能直接获得未安装列表,直接执行安装,不就能快一倍了
作者: went    时间: 2020-7-21 19:32

回复 19# hentai87
不是,可以设置变量,执行一次adb shell pm list package -3就行了
作者: hentai87    时间: 2020-7-21 19:40

回复 20# went


我apk名字是api_等级_包名
虽然不知道你怎么做
但估计还是得每次都查询一下api等级吧
作者: hentai87    时间: 2020-7-21 19:52

回复 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
作者: went    时间: 2020-7-21 19:56

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
复制代码

作者: hentai87    时间: 2020-7-21 20:12

回复 23# went


包名含有_的提取包名失败了
比如API_26_com.ihewro.android_expression_package
被弄成了com.ihewro
作者: hentai87    时间: 2020-7-21 20:17

回复 24# hentai87


    = =。
我感觉这个问题无解了,
我还以为_不会被用到的,没想到居然还是又包名用了。。。
我感觉我应该用#打标签。。。。
然后不会又遇到含有#的包名吧。。。。尴尬
作者: newswan    时间: 2020-7-21 20:25

存为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
作者: newswan    时间: 2020-7-21 20:32

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

(echo %s1%) | findsrt %s2%

%s2% 用""括起来

晕,前面的我忘记用引号了。
作者: went    时间: 2020-7-21 20:38

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

作者: went    时间: 2020-7-21 20:40

*表示第二段后面的所有字符,包含分隔符在内的
作者: hentai87    时间: 2020-7-21 20:47

回复 27# newswan


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


adb 123
adb 456
作者: hentai87    时间: 2020-7-21 21:38

回复 29# went


有个问题,最后到要安装那步。。。前面的api等级未知。。。。又不能adb *%%i.apk
作者: newswan    时间: 2020-7-22 00:38

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

作者: went    时间: 2020-7-23 17:09

回复 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
复制代码

作者: smss    时间: 2020-7-23 17:29

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




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2