返回列表 发帖

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

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

脚本没问题,就是用到了临时文件1.txt 2.txt,我想不用
@echo off
::adb临时加入到path环境变量
set My_PATH=.\SDK\adb
set PATH=%PATH%;%My_PATH%
md .\bak\ 2>nul
setlocal enabledelayedexpansion
::列出已装的app
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)
ECHO !P!>>1.TXT
for %%i in (.\bak\*!P!.apk) do ECHO !P!>>2.TXT
)
for /f "delims=" %%i in ('findstr /g:2.TXT /v 1.TXT 2^>nul') do echo %%i
del 1.TXT 2>nul
del 2.TXT 2>nul
pauseCOPY

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

TOP

回复 31# hentai87

for 中可以给变量添加很多你需要的附加参数,用#分隔
我帮你添加了本地文件路径和远程apk路径,其它的你自由发挥
@echo off
setlocal enabledelayedexpansion
REM 记录已备份的apk
for /f "tokens=1,2* delims=_" %%i in ('dir /b .\bak\*_*_*.apk') do set "#%%~nk=已备份#未安装#%%i_%%j_%%k"
REM 记录已安装的apk
for /f "tokens=1-3* delims=:=" %%i in ('adb shell pm list packages -f -a') do (
if "%%l"=="" (
if "!#%%k!"=="" (
set "#%%k=未备份#已安装#_#%%j"
) else (
set "#%%i=已备份#已安装!#%%k:~7!#%%j"
)
) else (
if "!#%%l!"=="" (
set "#%%l=未备份#已安装#_#%%j==%%k"
) else (
set "#%%i=已备份#已安装!#%%l:~7!#%%j==%%k"
)
)
)
REM 过滤
echo 已备份#未安装:
echo.
for /f "tokens=1-3* delims=#" %%i in ('set # ^| findstr "已备份#未安装"') do (
set "pkgName=%%i"
echo 包名: !pkgName:~0,-4!
echo 文件: .\bak\%%k
echo.
)
echo -----------------------------------------------------
echo 未备份#已安装:
echo.
for /f "tokens=1-3* delims=#" %%i in ('set # ^| findstr "未备份#已安装"') do (
set "pkgName=%%i"
echo 包名: !pkgName:~0,-4!
echo 路径: %%l
echo.
)
echo -----------------------------------------------------
pause&exitCOPY

TOP

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

TOP

回复 29# went


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

TOP

回复 27# newswan


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


adb 123
adb 456

TOP

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

TOP

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

评分人数

TOP

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

(echo %s1%) | findsrt %s2%

%s2% 用""括起来

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

评分人数

TOP

存为2个文件 s1.txt s2.txt
@echo off
setlocal enableDelayedExpansion
set _Lf_=^&echo,
for /f %%i in (s1.txt) do (
set s1=!s1!%%i!_Lf_!
)
echo %s1%
for /f %%i in (s2.txt) do (
set "s2=!s2!%%i "
)
echo %s2%
echo,
(echo %s1%) | findstr "%s2%"COPY
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行以下是过滤条件,可以灵活组合
@echo off
setlocal enabledelayedexpansion
REM 记录已备份的apk
for /f "tokens=3 delims=_" %%i in ('dir /b .\bak\*.apk') do set "#%%~ni=已备份#未安装"
REM 记录已安装的apk
for /f "tokens=2 delims=:" %%i in ('adb shell pm list package -3') do (
if "!#%%i!"=="" (
set "#%%i=未备份#已安装"
) else (
set "#%%i=已备份#已安装"
)
)
REM 过滤
echo 未安装:
for /f "delims=#=" %%i in ('set # ^| findstr "未安装"') do echo %%i
echo ------------------------
echo 未备份:
for /f "delims=#=" %%i in ('set # ^| findstr "未备份"') do echo %%i
echo ------------------------
echo 已安装:
for /f "delims=#=" %%i in ('set # ^| findstr "已安装"') do echo %%i
echo ------------------------
echo 已备份:
for /f "delims=#=" %%i in ('set # ^| findstr "已备份"') do echo %%i
echo ------------------------
pause&exitCOPY
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

返回列表