SHARE
TWEET

_RegSearch

AZJIO Jun 5th, 2012 1,044 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top