Board logo

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

作者: thp2008    时间: 2023-11-2 17:11     标题: [已解决]请帮我看一个提取字符串的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表示,如果有更好的办法,也可以。

感谢大神们来帮忙!
作者: Batcher    时间: 2023-11-2 17:44

回复 1# thp2008


试试这样能否解决问题2:
findstr /n "^" UsersDatabase.txt | findstr /i /b "2:BeiZhu="
作者: thp2008    时间: 2023-11-2 17:53

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"
复制代码
不知道问题出在那
作者: ShowCode    时间: 2023-11-2 17:56

回复 1# thp2008


1-v1.bat
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 请选择要查询的用户:
  4. set "count=0"
  5. for /f "tokens=1,2 delims==" %%a in ('findstr /n .* UsersDatabase.txt ^| findstr /i ":UserName="') do (
  6.     set /a count+=1
  7.     for /f "delims=:" %%k in ("%%a") do (
  8.         set "line=%%k"
  9.         set /a line1=!line!+1
  10.         for /f "tokens=1,2 delims==" %%x in ('findstr /n .* UsersDatabase.txt ^| findstr /i /b "!line1!:BeiZhu="') do (
  11.             set "BeiZhu=%%y"
  12.         )
  13.     )
  14.     echo !count!. %%b --- !BeiZhu!
  15. )
  16. pause
复制代码

作者: ShowCode    时间: 2023-11-2 18:02

回复 1# thp2008


1-v2.bat
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 请选择要查询的用户:
  4. set "count=0"
  5. for /f "tokens=1,2 delims==" %%a in ('type "UsersDatabase.txt"') do (
  6.     if "%%a" == "UserName" (
  7.         set "ThisName=%%b"
  8.         set /a count+=1
  9.     ) else if "%%a" == "BeiZhu" (
  10.         set "ThisComment=%%b"
  11.     ) else (
  12.         echo !count!. !ThisName! --- !ThisComment!
  13.     )
  14. )
  15. pause
复制代码

作者: thp2008    时间: 2023-11-2 18:09

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


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


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

再请问一下高手:

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

回复 6# thp2008
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims==" %%a in ('findstr "UserID=" "UsersDatabase.txt"') do (
  4.     set "ThisID=%%b"
  5.     echo,!ThisID!
  6. )
  7. pause
复制代码

作者: Five66    时间: 2023-11-3 08:04

问题一是因为开启了变量延迟,并且有英文感叹号包围的变量!line1!,使得搜索字符串中的单个的^符号被escape变成空了,得换成两个^
问题二换成从行的开始处findstr
  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 /ib "!line1!:BeiZhu="') do (
  12.                     set "BeiZhu=%%y"
  13.     )
  14.   )
  15.        echo !count!. %%b --- !BeiZhu!
  16. )
  17. pause
复制代码





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