标题: [注册表类] 批处理如何查找注册表 hex(2) 值? [打印本页]
作者: tiandyoin 时间: 5 天前 20:57 标题: 批处理如何查找注册表 hex(2) 值?
本帖最后由 tiandyoin 于 2024-12-24 10:01 编辑
想用 findstr 找出注册表的 hex(2) 值,自己研究一夜的式子,但未能适用所有情况:- rem 把 '\"' 双引号加反斜杠去掉
- set "$=!line:\"=!"
- rem 查找 形式如 @=hex(2):... 或 ""=hex(2):.. 或 "..."=hex(2):
- cd.&echo;!$!!$!| >nul findstr /i/r /c:"^[ ]*@[ ]*=[ ]*hex(2):" /c:"^[ ]*\""[^\"]*\""[ ]*=[ ]*hex^(2^):"
复制代码
用例:- [HKEY_CURRENT_USER\tiandyoin\test18]
- @=hex(2):25,00,30,00,24,00,00,00
- ""=hex(2):25,00,30,00,24,00,00,00
- "@"=hex(2):25,00,30,00,24,00,\
- 00,00
- "normal"=hex(2):25,00,30,00,24,00,00,00
- "hello world"=hex(2):25,00,30,00,24,00,00,00
- "\""=hex(2):25,00,30,00,24,00,00,00
- "\"abc\""=hex(2):25,00,30,00,24,00,00,\
- 00
- "hello world\\\\\\\""=hex(2):25,00,30,00,24,00,00,00
- "A \\B \\ C\\"=hex(2):00,00
- "A=\"B"=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,00,00
- "A=\"=hex(2):"=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,00,00
复制代码
作者: aloha20200628 时间: 5 天前 21:27
本帖最后由 aloha20200628 于 2024-12-24 18:19 编辑
回复 1# tiandyoin - findstr /i "[0-9a-f][0-9a-f,\\]*$" "hex2.txt"
复制代码
作者: tiandyoin 时间: 4 天前 09:57
本帖最后由 tiandyoin 于 2024-12-24 10:08 编辑
回复 2# aloha20200628
(1) 你想当然了, findstr 不是按 ASCII 码排序的, [0-9A-Za-z] 不是你想要的样子。
而且注册表值,允许任何字符,只要转义反斜杠和双引号就行
(2) ".."=hex:11,22,33,44,\
".."=hex(7):11,22,33
这些你都没想到吧,我列了很多例子,你也没仔细看
作者: tiandyoin 时间: 4 天前 10:12
本帖最后由 tiandyoin 于 2024-12-24 10:16 编辑
回复 2# aloha20200628 -
- * 重复的范围是 [0-9a-z,\\] 还是 [0-9a-z][0-9a-z,\\] ?
复制代码
作者: aloha20200628 时间: 4 天前 11:43
本帖最后由 aloha20200628 于 2024-12-24 18:22 编辑
回复 3# tiandyoin
一。findstr 的正则匹配能力很弱,量词只有 *,更没有分组/环视/...等精细匹配模式,而且其返回的匹配结果是整行而非字段,因此只能用其瞄准行内关键词
二。楼主题目中明确指定是 hex(2) 数列,故其特征字符就是不区分大小写的 [0-9a-f,\\]
三。因为 findstr 不支持量词 + 故须采用 [0-9a-f,] 重复匹配
作者: 77七 时间: 4 天前 14:27
echo a| >nul find "a" 如此,把find的结果 >nul ,怎么会有结果?
作者: tiandyoin 时间: 4 天前 16:28
回复 6# 77七
不要去讨论些不重要的问题,后面根据 if errorlevel 就可以判断。
我问的问题是要写一个通用的正则表达式
作者: tiandyoin 时间: 4 天前 16:30
回复 5# aloha20200628
你都说不能分组了,使用*就只能匹配最后一个字符,你的方案是行不通的
作者: tiandyoin 时间: 4 天前 16:33
本帖最后由 tiandyoin 于 2024-12-24 17:08 编辑
- set "$=!line:\\=!"
- set "$=!$:\"=!"
- cd.&echo;!$!!$!| >nul findstr /i /r /c:"^[ ]*@[ ]*=[ ]*hex(2):" /c:"^[ ]*\""[^\"]*\""[ ]*=[ ]*hex^(2^):"
复制代码
我自己解决了,不过式子挺长的,而且双引号不成对,findstr 命令后面不能再加东西了- rem 这式子比较粗略吧,不过只要最后一个字符不是双引号,基本就匹配 hex(2) 串了
- cd.&echo;!line!!line!| >nul findstr /i /r /c:"=hex(2):[0-9a-f][0-9a-f ,\\]*$"
复制代码
要匹配空格,得加 /r /c
作者: 77七 时间: 4 天前 17:54
=hex(2):
含有该字符串的哪些行需要排除?这个问题不知道是否重要?
作者: aloha20200628 时间: 4 天前 19:18
本帖最后由 aloha20200628 于 2024-12-24 19:37 编辑
回复 8# tiandyoin
复查了一遍,若将一楼的示例数据存为 hex2.txt(须保留文件末尾有一空行否则最后一行 hex 数据会被遗漏),用以下一行流代码即可全部匹配出各行的 hex(2) 数据...- findstr /i "[0-9a-f][0-9a-f,\\]*$" "hex2.txt"
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |