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

[文本处理] [已解决]请帮我看一个提取字符串的BAT代码的问题

本帖最后由 thp2008 于 2023-11-2 18:09 编辑

UsersDatabase.txt的内容如下:
UserName=user01
BeiZhu=备注名01
UserID=eyJ0Stas31001
UserName=user02
BeiZhu=备注名02
UserID=eyJ0Stas32002
UserName=user03
BeiZhu=备注名03
UserID=eyJ0Stas33003
UserName=user04
BeiZhu=备注名04
UserID=eyJ0Stas34004
UserName=user05
BeiZhu=备注名05
UserID=eyJ0Stas35005
.......
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 请选择要查询的用户:
  4. echo.
  5. set /a count=0
  6. for /f "tokens=1,2 delims==" %%a in ('findstr /n "^" UsersDatabase.txt ^| findstr /i ":UserName="') do (
  7.     set /a count+=1
  8.         for /f "delims=: tokens=1" %%k in ("%%a") do (set "line=%%k"
  9.             set /a line1=!line!+1
  10.                    echo !line1!
  11.                 for /f "tokens=1,2 delims==" %%x in ('findstr /n "^" UsersDatabase.txt ^| findstr /i "!line1!:BeiZhu="') do (
  12.                     set "BeiZhu=%%y"
  13.     )
  14.   )
  15.        echo !count!. %%b --- !BeiZhu!
  16. )
复制代码
问题一:

其中 %%b 和 echo !line1!  中的!line1!  的值都正确。
问题出在这里:
for /f "tokens=1,2 delims==" %%x in ('findstr /n "^" UsersDatabase.txt ^| findstr /i "!line1!:BeiZhu="') do (
                    set "BeiZhu=%%y"

这个值输出不正确,显示FINDSTR: 没有搜索字符串

但是我直接在命令行下测试:是可以找到结果的2:BeiZhu=备注名01
findstr /n "^" UsersDatabase.txt ^| findstr /i "2:BeiZhu="
2:BeiZhu=备注名01

但是这里,我发现有时候很奇怪,就是有时候,查询不出,有时候可以,不知道是不是我的延迟变量没有处理好。还是语法有问题。

感觉是我语法上,还是什么问题。

我最终需要输出两个变量用户名和对应的备注名

echo  !count!.  用户名 ---  备注名

显示效果如下:
请选择要查询的用户:
1.user01 --- 备注名01
2.user01 --- 备注名02
3.user01 --- 备注名03
4.user01 --- 备注名04
5.user01 --- 备注名05
......

问题二:
!line1! 的值,我想用三位表示,因为真实的USERDATABASE.txt的数据很多,如果不补足三位,就会出现findstr /n "^" UsersDatabase.txt ^| findstr /i "!line1!:BeiZhu="  找到不唯一的数据。
比如:
findstr /n "^" UsersDatabase2.txt | findstr /i "2:BeiZhu="

2:BeiZhu=备注名01
32:BeiZhu=备注名27
62:BeiZhu=备注名54
92:BeiZhu=备注名83
122:BeiZhu=备注名110
152:BeiZhu=备注名132
182:BeiZhu=备注名170
类似这样,所以我想将这个序号,格式化成三位数字,不足3位的用零补齐。如2就用002表示。35就用035表示,如果有更好的办法,也可以。

感谢大神们来帮忙!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

D:\Test>findstr /n "^" UsersDatabase.txt | findstr /i /b "2:BeiZhu="
2:BeiZhu=备注名01

D:\Test>findstr /n "^" UsersDatabase.txt | findstr /i "2:BeiZhu="
2:BeiZhu=备注名01

单独这样运行,是可以的,但是,放在批处理中就总是提示:FINDSTR: 没有搜索字符串

放在批处理中,我是这样写的
  1. for /f "tokens=1,2 delims==" %%x in ('findstr /n "^" UsersDatabase.txt ^| findstr /i "!line1!:BeiZhu="') do (
  2.             set "BeiZhu=%%y"
  3. for /f "tokens=1,2 delims==" %%x in ('findstr /n "^" UsersDatabase.txt ^| findstr /i /b "!line1!:BeiZhu="') do (
  4.             set "BeiZhu=%%y"
复制代码
不知道问题出在那

TOP

本帖最后由 thp2008 于 2023-11-2 18:51 编辑
回复  thp2008


1-v2.bat
ShowCode 发表于 2023-11-2 18:02


你这个办法好,感谢,两个问题都解决了。

再请问一下高手:

就是我的UserID=这个字段,=后面的字符号很长,需要整体作为字符串,但是里面有的ID有=号,所以不能用=号作为分隔符,需要采用别的方式。可以怎样提取UserID=后面的字符串。

TOP

返回列表