返回列表 发帖

[注册表类] 批处理如何查找注册表 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^):"COPY
用例:
[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,00COPY

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

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

TOP

本帖最后由 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
       这些你都没想到吧,我列了很多例子,你也没仔细看

TOP

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

回复 2# aloha20200628
   
* 重复的范围是 [0-9a-z,\\]  还是 [0-9a-z][0-9a-z,\\] ?COPY

TOP

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

回复 3# tiandyoin

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

TOP

echo a| >nul find "a" 如此,把find的结果 >nul ,怎么会有结果?
bat小白,请多指教!谢谢!

TOP

回复 6# 77七


    不要去讨论些不重要的问题,后面根据 if errorlevel 就可以判断。
   我问的问题是要写一个通用的正则表达式

TOP

回复 5# aloha20200628


    你都说不能分组了,使用*就只能匹配最后一个字符,你的方案是行不通的

TOP

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

TOP

=hex(2):
含有该字符串的哪些行需要排除?这个问题不知道是否重要?
bat小白,请多指教!谢谢!

TOP

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

回复 8# tiandyoin

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

TOP

返回列表