标题: [文本处理] [已解决]请帮我看一个提取字符串的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
.......- @echo off
- setlocal enabledelayedexpansion
-
- echo 请选择要查询的用户:
- echo.
- set /a count=0
- for /f "tokens=1,2 delims==" %%a in ('findstr /n "^" UsersDatabase.txt ^| findstr /i ":UserName="') do (
- set /a count+=1
- for /f "delims=: tokens=1" %%k in ("%%a") do (set "line=%%k"
- set /a line1=!line!+1
- echo !line1!
- for /f "tokens=1,2 delims==" %%x in ('findstr /n "^" UsersDatabase.txt ^| findstr /i "!line1!:BeiZhu="') do (
- set "BeiZhu=%%y"
- )
-
- )
- echo !count!. %%b --- !BeiZhu!
- )
复制代码
问题一:
其中 %%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: 没有搜索字符串
放在批处理中,我是这样写的- for /f "tokens=1,2 delims==" %%x in ('findstr /n "^" UsersDatabase.txt ^| findstr /i "!line1!:BeiZhu="') do (
- set "BeiZhu=%%y"
-
- for /f "tokens=1,2 delims==" %%x in ('findstr /n "^" UsersDatabase.txt ^| findstr /i /b "!line1!:BeiZhu="') do (
- set "BeiZhu=%%y"
复制代码
不知道问题出在那
作者: ShowCode 时间: 2023-11-2 17:56
回复 1# thp2008
1-v1.bat- @echo off
- setlocal enabledelayedexpansion
- echo 请选择要查询的用户:
- set "count=0"
- for /f "tokens=1,2 delims==" %%a in ('findstr /n .* UsersDatabase.txt ^| findstr /i ":UserName="') do (
- set /a count+=1
- for /f "delims=:" %%k in ("%%a") do (
- set "line=%%k"
- set /a line1=!line!+1
- for /f "tokens=1,2 delims==" %%x in ('findstr /n .* UsersDatabase.txt ^| findstr /i /b "!line1!:BeiZhu="') do (
- set "BeiZhu=%%y"
- )
- )
- echo !count!. %%b --- !BeiZhu!
- )
- pause
复制代码
作者: ShowCode 时间: 2023-11-2 18:02
回复 1# thp2008
1-v2.bat- @echo off
- setlocal enabledelayedexpansion
- echo 请选择要查询的用户:
- set "count=0"
- for /f "tokens=1,2 delims==" %%a in ('type "UsersDatabase.txt"') do (
- if "%%a" == "UserName" (
- set "ThisName=%%b"
- set /a count+=1
- ) else if "%%a" == "BeiZhu" (
- set "ThisComment=%%b"
- ) else (
- echo !count!. !ThisName! --- !ThisComment!
- )
- )
- 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 - @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims==" %%a in ('findstr "UserID=" "UsersDatabase.txt"') do (
- set "ThisID=%%b"
- echo,!ThisID!
- )
- pause
复制代码
作者: Five66 时间: 2023-11-3 08:04
问题一是因为开启了变量延迟,并且有英文感叹号包围的变量!line1!,使得搜索字符串中的单个的^符号被escape变成空了,得换成两个^
问题二换成从行的开始处findstr- @echo off
- setlocal enabledelayedexpansion
-
- echo 请选择要查询的用户:
- echo.
- set /a count=0
- for /f "tokens=1,2 delims==" %%a in ('findstr /n "^" UsersDatabase.txt ^| findstr /i ":UserName="') do (
- set /a count+=1
- for /f "delims=: tokens=1" %%k in ("%%a") do (set "line=%%k"
- set /a line1=!line!+1
- echo !line1!
- for /f "tokens=1,2 delims==" %%x in ('findstr /n "^^" UsersDatabase.txt ^| findstr /ib "!line1!:BeiZhu="') do (
- set "BeiZhu=%%y"
- )
-
- )
- echo !count!. %%b --- !BeiZhu!
- )
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |