Board logo

标题: [注册表类] 批处理如何查找注册表 hex(2) 值? [打印本页]

作者: tiandyoin    时间: 前天 20:57     标题: 批处理如何查找注册表 hex(2) 值?

本帖最后由 tiandyoin 于 2024-12-24 10:01 编辑

想用 findstr 找出注册表的 hex(2) 值,自己研究一夜的式子,但未能适用所有情况:
  1. rem 把 '\"' 双引号加反斜杠去掉
  2. set "$=!line:\"=!"
  3. rem 查找 形式如 @=hex(2):... 或 ""=hex(2):.. 或 "..."=hex(2):
  4. cd.&echo;!$!!$!| >nul findstr /i/r /c:"^[ ]*@[ ]*=[ ]*hex(2):" /c:"^[ ]*\""[^\"]*\""[ ]*=[ ]*hex^(2^):"
复制代码
用例:
  1. [HKEY_CURRENT_USER\tiandyoin\test18]
  2. @=hex(2):25,00,30,00,24,00,00,00
  3. ""=hex(2):25,00,30,00,24,00,00,00
  4. "@"=hex(2):25,00,30,00,24,00,\
  5.   00,00
  6. "normal"=hex(2):25,00,30,00,24,00,00,00
  7. "hello world"=hex(2):25,00,30,00,24,00,00,00
  8. "\""=hex(2):25,00,30,00,24,00,00,00
  9. "\"abc\""=hex(2):25,00,30,00,24,00,00,\
  10.   00
  11. "hello world\\\\\\\""=hex(2):25,00,30,00,24,00,00,00
  12. "A \\B \\ C\\"=hex(2):00,00
  13. "A=\"B"=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,00,00
  14. "A=\"=hex(2):"=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,00,00
复制代码

作者: aloha20200628    时间: 前天 21:27

本帖最后由 aloha20200628 于 2024-12-24 18:19 编辑

回复 1# tiandyoin
  1. findstr /i "[0-9a-f][0-9a-f,\\]*$" "hex2.txt"
复制代码

作者: tiandyoin    时间: 昨天 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    时间: 昨天 10:12

本帖最后由 tiandyoin 于 2024-12-24 10:16 编辑

回复 2# aloha20200628
  1.    
  2. * 重复的范围是 [0-9a-z,\\]  还是 [0-9a-z][0-9a-z,\\] ?
复制代码

作者: aloha20200628    时间: 昨天 11:43

本帖最后由 aloha20200628 于 2024-12-24 18:22 编辑

回复 3# tiandyoin

一。findstr 的正则匹配能力很弱,量词只有 *,更没有分组/环视/...等精细匹配模式,而且其返回的匹配结果是整行而非字段,因此只能用其瞄准行内关键词
二。楼主题目中明确指定是 hex(2) 数列,故其特征字符就是不区分大小写的 [0-9a-f,\\]
三。因为 findstr 不支持量词 + 故须采用 [0-9a-f,] 重复匹配

作者: 77七    时间: 昨天 14:27

echo a| >nul find "a" 如此,把find的结果 >nul ,怎么会有结果?
作者: tiandyoin    时间: 昨天 16:28

回复 6# 77七


    不要去讨论些不重要的问题,后面根据 if errorlevel 就可以判断。
   我问的问题是要写一个通用的正则表达式
作者: tiandyoin    时间: 昨天 16:30

回复 5# aloha20200628


    你都说不能分组了,使用*就只能匹配最后一个字符,你的方案是行不通的
作者: tiandyoin    时间: 昨天 16:33

本帖最后由 tiandyoin 于 2024-12-24 17:08 编辑
  1. set "$=!line:\\=!"
  2. set "$=!$:\"=!"
  3. cd.&echo;!$!!$!| >nul findstr /i /r /c:"^[ ]*@[ ]*=[ ]*hex(2):" /c:"^[ ]*\""[^\"]*\""[ ]*=[ ]*hex^(2^):"
复制代码
我自己解决了,不过式子挺长的,而且双引号不成对,findstr 命令后面不能再加东西了
  1. rem 这式子比较粗略吧,不过只要最后一个字符不是双引号,基本就匹配 hex(2) 串了
  2. cd.&echo;!line!!line!| >nul findstr /i /r /c:"=hex(2):[0-9a-f][0-9a-f ,\\]*$"
复制代码
要匹配空格,得加 /r /c
作者: 77七    时间: 昨天 17:54

=hex(2):
含有该字符串的哪些行需要排除?这个问题不知道是否重要?
作者: aloha20200628    时间: 昨天 19:18

本帖最后由 aloha20200628 于 2024-12-24 19:37 编辑

回复 8# tiandyoin

复查了一遍,若将一楼的示例数据存为 hex2.txt(须保留文件末尾有一空行否则最后一行 hex 数据会被遗漏),用以下一行流代码即可全部匹配出各行的 hex(2) 数据...
  1. findstr /i "[0-9a-f][0-9a-f,\\]*$" "hex2.txt"
复制代码





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