Advertisement
AZJIO

_RegSearch

Jun 5th, 2012
1,517
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 17.33 KB | None | 0 0
  1. #include-once
  2. #Include <_RegFunc.au3> ; _RegRead   http://www.autoitscript.com/forum/topic/70108-custom-registry-functions-udf/
  3.  
  4. ; 2012.06.08
  5. ; _RegSearchKey
  6. ; _RegSearchValueName
  7. ; _RegSearchValue
  8.  
  9. ; ============================================================================================
  10. ; Function Name ...: _RegSearchKey (__RegSearchKey)
  11. ; Description ........: Search for a registry key name including the registry subkeys.
  12. ; Syntax................: _RegSearchKey($sMask[, $sKey[, $iFull = 1[, $iArray = 1]]])
  13. ; Parameters:
  14. ;       $sMask - mask, using symbols "*" and "?" with the separator "|".
  15. ;       $sKey - the registry key in which to search. By default, search the entire registry
  16. ;       $iFull - Affect the result
  17. ;                  |0 - the relative path to a registry key
  18. ;                  |1 - the full path to the registry key
  19. ;       $iArray - Specifies the result as an array or list
  20. ;                  |0 - the list with a separator @CRLF
  21. ;                  |1 - array, where $iArray[0]=number of found (By default)
  22. ;                  |2 - array, where $iArray[0] contains the first found section of the registry
  23. ; Return values ....: Success - Array or list with separator @CRLF
  24. ;                   Failure - empty string, @error:
  25. ;                  |0 - no error
  26. ;                  |2 - Invalid mask
  27. ;                  |3 - not found
  28. ; Author(s) ..........: AZJIO
  29. ; Remarks ..........: Not case sensitive only for the Latin alphabet
  30. ; ============================================================================================
  31. ; Имя функции ...: _RegSearchKey (__RegSearchKey)
  32. ; Описание ........: Поиск раздела реестра по маске, включая подразделы реестра.
  33. ; Синтаксис.......: _RegSearchKey($sMask[, $sKey[, $iFull = 1[, $iArray = 1]]])
  34. ; Параметры:
  35. ;       $sMask - маска с использованием символов "*" и "?" с перечислением через "|".
  36. ;       $sKey - раздел, в котором выполняется поиск. По умолчанию весь реестр
  37. ;       $iFull - Влияет на результат
  38. ;                  |0 - относительный путь к разделу реестра
  39. ;                  |1 - полный путь к разделу реестра
  40. ;       $iArray - (0,1,2) определяет вывод результата, массив или список
  41. ;                  |0 - список с разделителем @CRLF
  42. ;                  |1 - массив, в котором $iArray[0]=количество найденных разделов (по умолчанию)
  43. ;                  |2 - массив, в котором $iArray[0] содержит первый найденный раздел
  44. ; Возвращаемое значение: Успешно - Массив или список с разделителем @CRLF
  45. ;                   Неудачно - пустая строка, @error:
  46. ;                  |0 - нет ошибок
  47. ;                  |2 - неверная маска
  48. ;                  |3 - ничего не найдено
  49. ; Автор ..........: AZJIO
  50. ; Примечания ..: При поиске регистр букв не учитывается только для латинского алфавита
  51. ; ============================================================================================
  52. Func _RegSearchKey($sMask, $sKey = '*', $iFull = 1, $iArray = 1)
  53.     Local $vKeyList, $aKeyList, $i, $s=Chr(1)
  54.     If $sMask = '\' Then Return SetError(2, 0, '')
  55.     ; If Not StringRegExp($sKey, '(проверка валидности) Or StringInStr($sKey, '\\') Then Return SetError(1, 0, '')
  56.     ; If Not Exists($sKey) Then Return SetError(1, 0, '') ; проверка несуществования раздела
  57.  
  58.     If $sKey = '*' Or $sKey = '' Then
  59.         __RegSearchKey($vKeyList, 'HKEY_CLASSES_ROOT\') ; 90 сек
  60.         __RegSearchKey($vKeyList, 'HKEY_CURRENT_USER\') ; 0.7 сек
  61.         __RegSearchKey($vKeyList, 'HKEY_LOCAL_MACHINE\') ; 6.7 сек
  62.         __RegSearchKey($vKeyList, 'HKEY_USERS\') ; 0.9 сек
  63.         __RegSearchKey($vKeyList, 'HKEY_CURRENT_CONFIG\') ; 0.01 сек
  64.     Else
  65.         If StringRight($sKey, 1) <> '\' Then $sKey &= '\'
  66.         __RegSearchKey($vKeyList, $sKey)
  67.     EndIf
  68.    
  69.     $vKeyList = StringTrimRight($vKeyList, 2)
  70.     $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][{}()+.\\^$|=<>#]', '\\$0'), '?', '.'), '*', '.*?')
  71.     ; $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][$^.{}()+|]', '\\$0'), '?', '.'), '*', '.*?')
  72.     ; $sMask = StringRegExpReplace($sMask, '[][$^.{}()+*?|]', '\\$0') ; режим $mode при поиске указанных символов
  73.    
  74.     $aKeyList = StringRegExp($vKeyList, '(?mi)^(.+\001(?:' & $sMask & '))(?:\r|\z)', 3)
  75.  
  76.     $vKeyList = ''
  77.     For $i = 0 To UBound($aKeyList) - 1
  78.         $vKeyList &= $aKeyList[$i] & @CRLF
  79.     Next
  80.    
  81.     $vKeyList = StringReplace(StringTrimRight($vKeyList, 2), $s, '') ; использовать другой разделитель, вместо "|"
  82.     If Not $vKeyList Then Return SetError(3, 0, '')
  83.  
  84.     If $iFull = 0 Then $vKeyList = StringRegExpReplace($vKeyList, '(?m)^(?:.{' & StringLen($sKey) & '})(.*)$', '\1')
  85.     Switch $iArray
  86.         Case 1
  87.             $vKeyList = StringSplit($vKeyList, @CRLF, 1)
  88.         Case 2
  89.             $vKeyList = StringSplit($vKeyList, @CRLF, 3)
  90.     EndSwitch
  91.     Return $vKeyList
  92. EndFunc
  93.  
  94. Func __RegSearchKey(ByRef $sKeyList, $sKey)
  95.     Local $sTmp, $i = 0, $s=Chr(1)
  96.     While 1
  97.         $i += 1
  98.         $sTmp = RegEnumKey($sKey, $i)
  99.         If @error Then ExitLoop
  100.         $sKeyList &= $sKey & $s & $sTmp & @CRLF
  101.         __RegSearchKey($sKeyList, $sKey & $sTmp & '\')
  102.     WEnd
  103. EndFunc
  104.  
  105.  
  106.  
  107.  
  108.  
  109. ; ============================================================================================
  110. ; Function Name ...: _RegSearchValueName (__RegSearchValueName)
  111. ; Description ........: Search for a registry value name including the registry subkeys.
  112. ; Syntax................: _RegSearchKey($sMask[, $sKey[, $iFull = 1[, $iArray = 1]]])
  113. ; Parameters:
  114. ;       $sMask - mask, using symbols "*" and "?" with the separator "|".
  115. ;       $sKey - the registry key in which to search. By default, search the entire registry
  116. ;       $iFull - Affect the result
  117. ;                  |0 - the relative path to a registry key
  118. ;                  |1 - the full path to the registry key
  119. ;       $iArray - Specifies the result as an array or list
  120. ;                  |0 - the list with a separator @CRLF
  121. ;                  |1 - array, where $iArray[0]=number of found (By default)
  122. ;                  |2 - array, where $iArray[0] contains the first found section of the registry
  123. ; Return values ....: Success - Array or list with separator @CRLF
  124. ;                   Failure - empty string, @error:
  125. ;                  |0 - no error
  126. ;                  |2 - Invalid mask
  127. ;                  |3 - not found
  128. ; Author(s) ..........: AZJIO
  129. ; Remarks ..........: Not case sensitive only for the Latin alphabet
  130. ; ============================================================================================
  131. ; Имя функции ...: _RegSearchValueName (__RegSearchValueName)
  132. ; Описание ........: Поиск параметра реестра по маске, включая подразделы реестра.
  133. ; Синтаксис.......: _RegSearchValueName($sMask[, $sKey[, $iFull = 1[, $iArray = 1]]])
  134. ; Параметры:
  135. ;       $sMask - маска с использованием символов "*" и "?" с перечислением через "|".
  136. ;       $sKey - раздел, в котором выполняется поиск. По умолчанию весь реестр
  137. ;       $iFull - Влияет на результат
  138. ;                  |0 - относительный путь к разделу реестра
  139. ;                  |1 - полный путь к разделу реестра
  140. ;       $iArray - (0,1,2) определяет вывод результата, массив или список
  141. ;                  |0 - список с разделителем @CRLF
  142. ;                  |1 - массив, в котором $iArray[0]=количество найденных параметров (по умолчанию)
  143. ;                  |2 - массив, в котором $iArray[0] содержит первый найденный раздел
  144. ; Возвращаемое значение: Успешно - Массив или список с разделителем @CRLF
  145. ;                   Неудачно - пустая строка, @error:
  146. ;                  |0 - нет ошибок
  147. ;                  |2 - неверная маска
  148. ;                  |3 - ничего не найдено
  149. ; Автор ..........: AZJIO
  150. ; Примечания ..: При поиске регистр букв не учитывается только для латинского алфавита
  151. ; ============================================================================================
  152. Func _RegSearchValueName($sMask, $sKey = '*', $iFull = 1, $iArray = 1)
  153.     Local $vKeyList, $aKeyList, $i, $s=Chr(1)
  154.     If $sMask = '\' Then Return SetError(2, 0, '')
  155.     ; If Not StringRegExp($sKey, '(проверка валидности) Or StringInStr($sKey, '\\') Then Return SetError(1, 0, '')
  156.     ; If Not Exists($sKey) Then Return SetError(1, 0, '') ; проверка несуществования раздела
  157.  
  158.     If $sKey = '*' Or $sKey = '' Then
  159.         __RegSearchValueName($vKeyList, 'HKEY_CLASSES_ROOT\') ; 90 сек
  160.         __RegSearchValueName($vKeyList, 'HKEY_CURRENT_USER\') ; 3.3 сек
  161.         __RegSearchValueName($vKeyList, 'HKEY_LOCAL_MACHINE\') ; 15 сек
  162.         __RegSearchValueName($vKeyList, 'HKEY_USERS\') ; 4.2 сек
  163.         __RegSearchValueName($vKeyList, 'HKEY_CURRENT_CONFIG\') ; 0.01 сек
  164.     Else
  165.         ; If StringRight($sKey, 1) <> '\' Then $sKey &= '\'
  166.         __RegSearchValueName($vKeyList, $sKey)
  167.     EndIf
  168.    
  169.     $vKeyList = StringTrimRight($vKeyList, 2)
  170.     $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][{}()+.\\^$|=<>#]', '\\$0'), '?', '.'), '*', '.*?')
  171.     ; $sMask = StringRegExpReplace($sMask, '[][$^.{}()+*?|]', '\\$0') ; режим $mode при поиске указанных символов
  172.    
  173.     $aKeyList = StringRegExp($vKeyList, '(?mi)^(.+\001(?:' & $sMask & '))(?:\r|\z)', 3)
  174.  
  175.     $vKeyList = ''
  176.     For $i = 0 To UBound($aKeyList) - 1
  177.         $vKeyList &= $aKeyList[$i] & @CRLF
  178.     Next
  179.  
  180.     $vKeyList = StringTrimRight($vKeyList, 2)
  181.     If Not $vKeyList Then Return SetError(3, 0, '')
  182.  
  183.     If $iFull = 0 Then $vKeyList = StringRegExpReplace($vKeyList, '(?m)^(?:.{' & StringLen($sKey)+1 & '})(.*)$', '\1')
  184.     Switch $iArray
  185.         Case 0
  186.             $vKeyList = StringReplace($vKeyList, $s, @Tab&'|'&@Tab)
  187.         Case 1
  188.             __ToArray2Row($vKeyList, 1)
  189.         Case 2
  190.             __ToArray2Row($vKeyList, 0)
  191.     EndSwitch
  192.     Return $vKeyList
  193. EndFunc
  194.  
  195. Func __ToArray2Row(ByRef $vKeyList, $m)
  196.     Local $aArray, $i, $s=Chr(1)
  197.     $aArray = StringSplit(StringReplace($vKeyList, @CRLF, $s), $s)
  198.     Dim $vKeyList[$aArray[0]/2+$m][2]
  199.     If $m Then
  200.         For $i = 1 To $aArray[0] Step 2
  201.             $p=($i+1)/2
  202.             $vKeyList[$p][0]=$aArray[$i]
  203.             $vKeyList[$p][1]=$aArray[$i+1]
  204.         Next
  205.         $vKeyList[0][0]=$p
  206.     Else
  207.         For $i = 1 To $aArray[0] Step 2
  208.             $p=($i-1)/2
  209.             $vKeyList[$p][0]=$aArray[$i]
  210.             $vKeyList[$p][1]=$aArray[$i+1]
  211.         Next
  212.     EndIf
  213. EndFunc
  214.  
  215. Func __RegSearchValueName(ByRef $sKeyList, $sKey)
  216.     Local $sTmp, $i = 0, $s=Chr(1)
  217.     While 1
  218.         $i += 1
  219.         $sTmp = RegEnumVal($sKey, $i)
  220.         If @error Then ExitLoop
  221.         $sKeyList &= $sKey & $s & $sTmp & @CRLF
  222.     WEnd
  223.     $i = 0
  224.     While 1
  225.         $i += 1
  226.         $sTmp = RegEnumKey($sKey, $i)
  227.         If @error Then ExitLoop
  228.         __RegSearchValueName($sKeyList, $sKey & '\' & $sTmp)
  229.     WEnd
  230. EndFunc
  231.  
  232.  
  233.  
  234. ; ============================================================================================
  235. ; Function Name ...: _RegSearchValue (__RegSearchValue)
  236. ; Description ........: Search  the value in the registry including the registry subkeys.
  237. ; Syntax................: _RegSearchValue($sMask[, $sKey[, $iFull = 1[, $iArray = 1]]])
  238. ; Parameters:
  239. ;       $sMask - mask, using symbols "*" and "?" with the separator "|".
  240. ;       $sKey - the registry key in which to search. By default, search the entire registry
  241. ;       $iFull - Affect the result
  242. ;                  |0 - the relative path to a registry key
  243. ;                  |1 - the full path to the registry key
  244. ;       $iArray - Specifies the result as an array or list
  245. ;                  |0 - the list with a separator @CRLF
  246. ;                  |1 - array, where $iArray[0]=number of found (By default)
  247. ;                  |2 - array, where $iArray[0] contains the first found section of the registry
  248. ; Return values ....: Success - Array or list with separator @CRLF
  249. ;                   Failure - empty string, @error:
  250. ;                  |0 - no error
  251. ;                  |2 - Invalid mask
  252. ;                  |3 - not found
  253. ; Author(s) ..........: AZJIO
  254. ; Remarks ..........: Not case sensitive only for the Latin alphabet
  255. ; ============================================================================================
  256. ; Имя функции ...: _RegSearchValue (__RegSearchValue)
  257. ; Описание ........: Поиск значения реестра по маске включая, в подразделы реестра.
  258. ; Синтаксис.......: _RegSearchValue($sMask[, $sKey[, $iFull = 1[, $iArray = 1]]])
  259. ; Параметры:
  260. ;       $sMask - маска с использованием символов "*" и "?" с перечислением через "|".
  261. ;       $sKey - раздел, в котором выполняется поиск. По умолчанию весь реестр
  262. ;       $iFull - Влияет на результат
  263. ;                  |0 - относительный путь к разделу реестра
  264. ;                  |1 - полный путь к разделу реестра
  265. ;       $iArray - (0,1,2) определяет вывод результата, массив или список
  266. ;                  |0 - список с разделителем @CRLF
  267. ;                  |1 - массив, в котором $iArray[0]=количество найденных значений (по умолчанию)
  268. ;                  |2 - массив, в котором $iArray[0] содержит первый найденный раздел
  269. ; Возвращаемое значение: Успешно - Массив или список с разделителем @CRLF
  270. ;                   Неудачно - пустая строка, @error:
  271. ;                  |0 - нет ошибок
  272. ;                  |2 - неверная маска
  273. ;                  |3 - ничего не найдено
  274. ; Автор ..........: AZJIO
  275. ; Примечания ..: При поиске регистр букв не учитывается только для латинского алфавита
  276. ; ============================================================================================
  277. Func _RegSearchValue($sMask, $sKey = '*', $iFull = 1, $iArray = 1)
  278.     Local $vKeyList, $aKeyList, $i, $s0=Chr(2), $s=Chr(1)
  279.     If $sMask = '\' Then Return SetError(2, 0, '')
  280.     ; If Not StringRegExp($sKey, '(проверка валидности) Or StringInStr($sKey, '\\') Then Return SetError(1, 0, '')
  281.     ; If Not Exists($sKey) Then Return SetError(1, 0, '') ; проверка несуществования раздела
  282.  
  283.     If $sKey = '*' Or $sKey = '' Then
  284.         __RegSearchValue($vKeyList, 'HKEY_CLASSES_ROOT\') ; 120 сек
  285.         __RegSearchValue($vKeyList, 'HKEY_CURRENT_USER\') ; 24 сек
  286.         __RegSearchValue($vKeyList, 'HKEY_LOCAL_MACHINE\') ; 65 сек
  287.         __RegSearchValue($vKeyList, 'HKEY_USERS\') ; 27 сек
  288.         __RegSearchValue($vKeyList, 'HKEY_CURRENT_CONFIG\') ; 0.02 сек
  289.     Else
  290.         ; If StringRight($sKey, 1) <> '\' Then $sKey &= '\'
  291.         __RegSearchValue($vKeyList, $sKey)
  292.     EndIf
  293.  
  294.     $vKeyList = StringTrimRight($vKeyList, 2)
  295.     $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][{}()+.\\^$|=<>#]', '\\$0'), '?', '.'), '*', '.*?')
  296.  
  297.     $aKeyList = StringRegExp($vKeyList, '(?mi)^(.+\001(?:' & $sMask & '))(?:\r|\z)', 3)
  298.  
  299.     $vKeyList = ''
  300.     For $i = 0 To UBound($aKeyList) - 1
  301.         $vKeyList &= $aKeyList[$i] & @CRLF
  302.     Next
  303.  
  304.     $vKeyList = StringTrimRight($vKeyList, 2)
  305.     If Not $vKeyList Then Return SetError(3, 0, '')
  306.  
  307.     If $iFull = 0 Then $vKeyList = StringRegExpReplace($vKeyList, '(?m)^(?:.{' & StringLen($sKey)+1 & '})(.*)$', '\1')
  308.     Switch $iArray
  309.         Case 0
  310.             $vKeyList = StringReplace($vKeyList, $s, @Tab&'|'&@Tab)
  311.             $vKeyList = StringReplace($vKeyList, $s0, @Tab&'|'&@Tab)
  312.         Case 1
  313.             __ToArray3Row($vKeyList, 1)
  314.         Case 2
  315.             __ToArray3Row($vKeyList, 0)
  316.     EndSwitch
  317.     Return $vKeyList
  318. EndFunc
  319.  
  320. Func __ToArray3Row(ByRef $vKeyList, $m)
  321.     Local $aArray, $i, $s0=Chr(2), $s=Chr(1)
  322.     $aArray = StringSplit(StringReplace(StringReplace($vKeyList, @CRLF, $s), $s0, $s), $s)
  323.     Dim $vKeyList[$aArray[0]/3+$m][3]
  324.     If $m Then
  325.         For $i = 1 To $aArray[0] Step 3
  326.             $p=($i+2)/3
  327.             $vKeyList[$p][0]=$aArray[$i]
  328.             $vKeyList[$p][1]=$aArray[$i+1]
  329.             $vKeyList[$p][2]=$aArray[$i+2]
  330.         Next
  331.         $vKeyList[0][0]=$p
  332.     Else
  333.         For $i = 1 To $aArray[0] Step 3
  334.             $p=($i-1)/3
  335.             $vKeyList[$p][0]=$aArray[$i]
  336.             $vKeyList[$p][1]=$aArray[$i+1]
  337.             $vKeyList[$p][2]=$aArray[$i+2]
  338.         Next
  339.     EndIf
  340. EndFunc
  341.  
  342. Func __RegSearchValue(ByRef $sKeyList, $sKey)
  343.     Local $sTmp, $sVal, $i = 0, $s0=Chr(2), $s=Chr(1)
  344.     While 1
  345.         $i += 1
  346.         $sTmp = RegEnumVal($sKey, $i)
  347.         If @error Then ExitLoop
  348.         $sVal = _RegRead($sKey, $sTmp) ; RegRead
  349.         If Not @error Then $sKeyList &= $sKey & $s0 & $sTmp & $s & $sVal & @CRLF
  350.     WEnd
  351.     $i = 0
  352.     While 1
  353.         $i += 1
  354.         $sTmp = RegEnumKey($sKey, $i)
  355.         If @error Then ExitLoop
  356.         __RegSearchValue($sKeyList, $sKey & '\' & $sTmp)
  357.     WEnd
  358. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement