找回密码
 加入
搜索
查看: 6371|回复: 7

[系统综合] 【已解决】遍历注册表项,遍历子键,算法请教

  [复制链接]
发表于 2014-3-2 15:13:38 | 显示全部楼层 |阅读模式
本帖最后由 vigiles 于 2014-3-3 11:47 编辑

希望实现注册表的树状查询与显示,得到键的树状图和每个节点的项。



代码写了很久,想通过递归实现效果,但算法上一直有错误,希望各位不吝赐教!
下面是目前有bug的代码:
;父键
Dim $fatherPath = "HKCC64"
ConsoleWrite("父键__" & $fatherPath & @CRLF & @CRLF)

Dim $i = 1

enumKey($fatherPath, $i)

;遍历键
func enumKey($keyPath, $ttt)
        ConsoleWrite("1.键路径:" & $keyPath & ",索引$i:" & $ttt & @CRLF)

        ;(1)首先遍历本路径的 项
        enumVal ($keyPath, 1 )

        ;(2)然后遍历本路径的子键【父键,索引】
        Local $key = RegEnumKey($keyPath, $ttt)
        If @error = 0 Then
                ;(3)如果读到了第一个子键
                Local $valPath = $keyPath & "" & $key
                ConsoleWrite("6.        下一级路径:" & $valPath & @CRLF)        ;调用@error就会改变其值

                ;(5)遍历子键内的 项
                enumVal ($valPath, 1 )

                ;(6)遍历下一级子键
                enumKey($valPath, 1)
        Else
                ;(4)如果没有子键
                ConsoleWrite("7.      下一级路径错误!" & @CRLF)
                $i = $i + 1
                enumKey($fatherPath, $i)
        endif

        ;(6)遍历下一个子键

        ConsoleWrite(@CRLF)
endfunc

;遍历项
func enumVal($valPath, $jjjj)
        ConsoleWrite("2.    子键路径:" & $valPath & ",索引$j:" & $jjjj & @CRLF)

        ;返回键的项(键,索引)
        Local $val = RegEnumVal($valPath, $jjjj)
        If @error = 0 Then
                ConsoleWrite("3.        项名称:" & $val & @CRLF)

                ;返回项的值(键,项)
                Local $p = RegRead($valPath, $val)
                ConsoleWrite("4.        读取项值:" & $p & @CRLF)

                enumVal ($valPath, $jjjj + 1 )
        Else
                ConsoleWrite("5.        项名称失败!" & @CRLF)
        endif
endfunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-3-3 01:58:58 | 显示全部楼层
while 1
   RegEnumKey(...)
   if @error then exitloop
   while 1
      RegEnumVal(...)
      RegRead(...)
      if @error then exitloop
   wend
wend
 楼主| 发表于 2014-3-3 10:59:56 | 显示全部楼层
while 1
   RegEnumKey(...)
   if @error then exitloop
   while 1
      RegEnumVal(...)
      Re ...
nmgwddj 发表于 2014-3-3 01:58



    能否实现一下?
 楼主| 发表于 2014-3-3 11:46:53 | 显示全部楼层
能否实现一下?
vigiles 发表于 2014-3-3 10:59


谢谢关注!根据你的提示终于实现了想要的效果。同时发现注册表里一个很有意思的东西


真的很长------



耗时两分半钟吧,不知道使用计时器得到的数字怎么回事

代码:
Dim $rootPath[5] = ["HKLM64", "HKU64", "HKCU64", "HKCR64", "HKCC64"], $fa = 1

$start = TimerInit()
;For $i=0 To 4
readReg("HKCR64\Local Settings\Software\Microsoft\Windows\CurrentVersion", $fa)
;Next
ConsoleWrite("运行时长:" & TimerDiff($start) & @CRLF)

Func readReg($faPath, $step)
        While 1
                ;获取子键(父键,索引)
                $naPath = RegEnumKey($faPath, $step)
                If Not @error Then
                        ConsoleWrite("键路径:" & $faPath & "" & $naPath & @CRLF)

                        ;----------------------遍历本键的项--------------------
                        Local $na = 1
                        While 1
                                ;获取项(键,索引)
                                $enVal = RegEnumVal($faPath & "" & $naPath, $na)
                                If @error Then ExitLoop
                                ConsoleWrite("        本键的项:" & $enVal & @CRLF)

                                ;读取项的值(键,项)
                                $val = RegRead($faPath & "" & $naPath, $enVal)

                                ConsoleWrite("        本项的值:" & $val & @CRLF)

                                $na = $na + 1
                        WEnd

                        ;----------------------遍历下一级 键---------------------
                        readReg($faPath & "" & $naPath, 1)
                Else
                        ExitLoop ;如果获取结束,退出
                EndIf

                $step = $step + 1

                ConsoleWrite(@CRLF)
        WEnd
EndFunc   ;==>readReg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-3-3 13:14:08 | 显示全部楼层
不错。留作备用。。。
发表于 2014-3-5 23:22:21 | 显示全部楼层
感謝大大分享
发表于 2014-3-6 09:11:03 | 显示全部楼层
这个很实用,先收藏了,谢谢分享。
发表于 2014-3-6 10:08:22 | 显示全部楼层
值得学习,支持你,辛苦了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 03:39 , Processed in 0.103531 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表