找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 117736|回复: 33

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

[复制链接]
发表于 2020-7-19 22:04:32 | 显示全部楼层 |阅读模式
本帖最后由 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


复制代码
发表于 2020-7-19 23:45:40 | 显示全部楼层
用变量,
set Lf=^&echo,

循环里
set file=!file!%Lf%!P!
 楼主| 发表于 2020-7-20 15:19:39 | 显示全部楼层
回复 2# newswan

怎么用到findstr里呢
发表于 2020-7-20 21:55:24 | 显示全部楼层
echo %file% | findsrt %str%
具体代码,自己
 楼主| 发表于 2020-7-20 22:39:56 | 显示全部楼层
回复 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
发表于 2020-7-20 22:44:31 | 显示全部楼层
是要查找没有备份的包名吗
 楼主| 发表于 2020-7-20 22:54:54 | 显示全部楼层
回复 6# went


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

但是反过来就不行了,【找未安装的备份去安装】
未安装显然不能if not exist,因为不是文件
但是又不存在 for no in 语法
发表于 2020-7-20 23:05:51 | 显示全部楼层
可以用dump来查看是否安装了相应的包名
你要在文件名中把包名截取出来
  1. adb shell pm dump com.tencent.mm | findstr /i /C:"Unable to find package" && ( echo 未安装 ) || ( echo 已安装 )
复制代码
发表于 2020-7-21 00:18:23 | 显示全部楼层
  1.   set file=!file!%%~ni!Lf!
复制代码
Lf 延迟扩展,并且放在 %%i 之后
 楼主| 发表于 2020-7-21 11:45:03 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2020-7-21 11:54:29 | 显示全部楼层
回复 8# went


    可行,但是每次都adb ,有点慢,还是先对比list吧
发表于 2020-7-21 14:37:05 | 显示全部楼层
本帖最后由 newswan 于 2020-7-21 14:38 编辑

匹配字符串,不用换行符,用空格分隔,
  1. set "s=!s!!P! "
复制代码
管道之前的命令,加括号
  1. (echo %f%) | findsrt %s%
复制代码
 楼主| 发表于 2020-7-21 16:16:23 | 显示全部楼层
回复 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
发表于 2020-7-21 17:10:34 | 显示全部楼层
  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 用空格
 楼主| 发表于 2020-7-21 17:39:36 | 显示全部楼层
回复 14# newswan


依旧闪退
我加了pause查了下,前面echo %s2% echo %s1%  没问题,
(echo %s1%) | findsrt %s2%这句可能有什么错误
s1 用换行符,s2 用空格,没错啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 04:13 , Processed in 0.015511 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表