Jump to content

Recommended Posts

Hi All, Sorry for my English

I searched the forum a function like that, and not found, indeed, there are many topics request regarding all this function, and I have done this, I did not know what name to put them RegEnumKeyToArray or RegListToArray or ect ect in the end I chose _RegEnumKeyValEx (_RegEnumKeyEx & _RegEnumValEx), the function does almost everything (also includes $sFilter as the >_FileListToArrayEx), and works really fast too

 

#include-once

; #UDF# =======================================================================================================================
; Title .........: Reads\Search the name of a Key\Subkey\Value
; AutoIt Version : 3.3.8.1
; Language ......: English
; Description ...: Lists all Keys\Subkeys\Values in a specified registry key
; Author(s) .....: DXRW4E
; Notes .........:
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
;~ _RegEnumKeyEx
;~ _RegEnumValEx
; ===============================================================================================================================

#Region ;**** Global constants and vars ****
Global Const $sValueTypes[12] = ["REG_NONE","REG_SZ","REG_EXPAND_SZ","REG_BINARY","REG_DWORD","REG_DWORD_BIG_ENDIAN","REG_LINK","REG_MULTI_SZ","REG_RESOURCE_LIST","REG_FULL_RESOURCE_DESCRIPTOR","REG_RESOURCE_REQUIREMENTS_LIST","REG_QWORD"]
#EndRegion ;**** Global constants and vars ****

; #FUNCTION# ========================================================================================================================
; Name...........: _RegEnumKeyEx
; Description ...: Lists all subkeys in a specified registry key
; Syntax.........: _RegEnumKeyEx($KeyName[, $iFlag = 0[, $sFilter = "*"]])
; Parameters ....: $KeyName - The registry key to read.
;                 $iFlag   - Optional specifies Recursion (add the flags together for multiple operations):
;                 |$iFlag = 0 (Default) All Key-SubKeys Recursive Mod
;                 |$iFlag = 1 All SubKeys Not Recursive Mod
;                 |$iFlag = 2 Include in ArrayList in the first element $KeyName
;                 |$iFlag = 16 $sFilter do Case-Sensitive matching (By Default $sFilter do Case-Insensitive matching)
;                 |$iFlag = 32 Disable the return the count in the first element - effectively makes the array 0-based (must use UBound() to get the size in this case).
;                   By Default the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.)
;                 |$iFlag = 64 $sFilter is REGEXP Mod, See Pattern Parameters in StringRegExp
;                 |$iFlag = 128 Enum value's name (_RegEnumKeyEx Return a 2D array, maximum Array Size limit is 3999744 Key\Value)
;                 |$iFlag = 256 Reads a value data, this flag will be ignored if the $iFlag = 128 is not set
;                 $sFilter - Optional the filter to use, default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ")
;                  Search the Autoit3 helpfile for the word "WildCards" For details.
;                 $vFilter - Optional the filter to use for ValueName, $vFilter will be ignored if the $iFlag = 128 is not set
;                  default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ") Search the Autoit3 helpfile for the word "WildCards" For details.
;                 $iValueTypes - Optional, set Value Types to search (Default $iValueTypes = 0 Read All), $iValueTypes will be ignored if the $iFlag = 128 is not set
;                   (add the flags together for multiple operations):
;                   1 = REG_SZ
;                   2 = REG_EXPAND_SZ
;                   3 = REG_BINARY
;                   4 = REG_DWORD
;                   5 = REG_DWORD_BIG_ENDIAN
;                   6 = REG_LINK
;                   7 = REG_MULTI_SZ
;                   8 = REG_RESOURCE_LIST
;                   9 = REG_FULL_RESOURCE_DESCRIPTOR
;                   10 = REG_RESOURCE_REQUIREMENTS_LIST
;                   11 = REG_QWORD
; Return values .: Success  - Return Array List (See Remarks)
;                 Failure - @Error
;                 |1 = Invalid $sFilter
;                 |2 = No Key-SubKey(s) Found
;                 |3 = Invalid $vFilter
;                 |4 = No Value-Name(s) Found
; Author ........: DXRW4E
; Modified.......:
; Remarks .......: The array returned is one-dimensional and is made up as follows:
;                               $array[0] = Number of Key-SubKeys returned
;                               $array[1] = 1st Key\SubKeys
;                               $array[2] = 2nd Key\SubKeys
;                               $array[3] = 3rd Key\SubKeys
;                               $array[n] = nth Key\SubKeys
;
;                 If is set the $iFlag = 128 The array returned is 2D array and is made up as follows:
;                               $array[0][0] = Number of Key-SubKeys returned
;                               $array[1][0] = 1st Key\SubKeys
;                               $array[1][1] = 1st Value name
;                               $array[1][2] = 1st Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[1][3] = 1st Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[2][0] = 2nd Key\SubKeys
;                               $array[2][1] = 2nd Value name
;                               $array[2][2] = 2nd Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[2][3] = 2nd Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[n][0] = nth Key\SubKeys
; Related .......: _RegEnumValEx()
; Link ..........:
; Example .......: _RegEnumKeyEx("HKEY_CURRENT_USER\Software\AutoIt v3")
; Note ..........:
; ===================================================================================================================================
Func _RegEnumKeyEx($KeyName, $iFlag = 0, $sFilter = "*", $vFilter = "*", $iValueTypes = 0)
    If StringRegExp($sFilter, StringReplace("^\s*$|\v|\\|^\||\|\||\|$", Chr(BitAND($iFlag, 64) + 28) & "\|^\||\|\||\|$", "\\\\")) Then Return SetError(1, 0, "")
    Local $IndexSubKey[101] = [100], $SubKeyName, $BS = "\", $sKeyList, $I = 1, $sKeyFlag = BitAND($iFlag, 1), $sKeyFilter = StringReplace($sFilter, "*", "")
    If BitAND($iFlag, 2) Then $sKeyList = @LF & $KeyName
    If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")"
    While $I
        $IndexSubKey[$I] += 1
        $SubKeyName = RegEnumKey($KeyName, $IndexSubKey[$I])
        If @error Then
            $IndexSubKey[$I] = 0
            $I -= 1
            $KeyName = StringLeft($KeyName, StringInStr($KeyName, "\", 1, -1) - 1)
            ContinueLoop
        EndIf
        If $sKeyFilter Then
            If StringRegExp($SubKeyName, $sFilter) Then $sKeyList &= @LF & $KeyName & $BS & $SubKeyName
        Else
            $sKeyList &= @LF & $KeyName & $BS & $SubKeyName
        EndIf
        If $sKeyFlag Then ContinueLoop
        $I += 1
        If $I > $IndexSubKey[0] Then
            $IndexSubKey[0] += 100
            ReDim $IndexSubKey[$IndexSubKey[0] + 1]
        EndIf
        $KeyName &= $BS & $SubKeyName
    WEnd
    If Not $sKeyList Then Return SetError(2, 0, "")
    If BitAND($iFlag, 128) <> 128 Then Return StringSplit(StringTrimLeft($sKeyList, 1), @LF, StringReplace(BitAND($iFlag, 32), "32", 2))
    $sKeyList = _RegEnumValEx(StringSplit(StringTrimLeft($sKeyList, 1), @LF), $iFlag, $vFilter, $iValueTypes)
    Return SetError(@Error, 0, $sKeyList)
EndFunc


; #FUNCTION# ========================================================================================================================
; Name...........: _RegEnumValEx
; Description ...: Lists all values in a specified registry key
; Syntax.........: _RegEnumValEx($KeyName[, $iFlag = 0[, $sFilter = "*"]])
; Parameters ....: $KeyName - The registry key to read Or one-dimensional array RegKeyList
;                   use _RegEnumKeyEx() to get $RegKeyList (example $RegKeyList = [3, 1st Key\SubKeys, 2st Key\SubKeys, nth Key\SubKeys])
;                 |$iFlag = 16 $sFilter do Case-Sensitive matching (By Default $sFilter do Case-Insensitive matching)
;                 |$iFlag = 32 Disable the return the count in the first element - effectively makes the array 0-based (must use UBound() to get the size in this case).
;                   By Default the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.)
;                 |$iFlag = 64 $sFilter is REGEXP Mod, See Pattern Parameters in StringRegExp
;                 |$iFlag = 256 Reads a value data
;                 $sFilter - Optional the filter to use, default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ")
;                  Search the Autoit3 helpfile for the word "WildCards" For details.
;                 $iValueTypes - Optional, set Value Types to search (Default $iValueTypes = 0 Read All)
;                   (add the flags together for multiple operations):
;                   1 = REG_SZ
;                   2 = REG_EXPAND_SZ
;                   3 = REG_BINARY
;                   4 = REG_DWORD
;                   5 = REG_DWORD_BIG_ENDIAN
;                   6 = REG_LINK
;                   7 = REG_MULTI_SZ
;                   8 = REG_RESOURCE_LIST
;                   9 = REG_FULL_RESOURCE_DESCRIPTOR
;                   10 = REG_RESOURCE_REQUIREMENTS_LIST
;                   11 = REG_QWORD
; Return values .: Success  - Return Array List (See Remarks)
;                 Failure - @Error
;                 |3 = Invalid $sFilter
;                 |4 = No Value-Name(s) Found
; Author ........: DXRW4E
; Modified.......:
; Remarks .......: The array returned is 2D array and is made up as follows:
;                               $array[0][0] = Number of Key-SubKeys returned
;                               $array[1][0] = 1st Key\SubKeys
;                               $array[1][1] = 1st Value name
;                               $array[1][2] = 1st Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[1][3] = 1st Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[2][0] = 2nd Key\SubKeys
;                               $array[2][1] = 2nd Value name
;                               $array[2][2] = 2nd Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect)
;                               $array[2][3] = 2nd Value Data (If is set $iFlag = 256 Else Value Data = "")
;                               $array[n][0] = nth Key\SubKeys
; Related .......: _RegEnumKeyEx()
; Link ..........:
; Example .......: _RegEnumValEx("HKEY_CURRENT_USER\Software\AutoIt v3")
; Note ..........:
; ===================================================================================================================================
Func _RegEnumValEx($aKeyList, $iFlag = 0, $sFilter = "*", $iValueTypes = 0)
    If StringRegExp($sFilter, "\v") Then Return SetError(3, 0, "")
    If Not IsArray($aKeyList) Then $aKeyList = StringSplit($aKeyList, @LF)
    Local $aKeyValList[1954][4], $iKeyVal = Int(BitAND($iFlag, 32) = 0), $sKeyVal = 1953, $sRegEnumVal, $iRegEnumVal, $RegRead = BitAND($iFlag, 256), $vFilter = StringReplace($sFilter, "*", "")
    If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")"
    For $i = 1 To $aKeyList[0]
        $iRegEnumVal = 0
        While 1
            If $iKeyVal = $sKeyVal Then
                If $sKeyVal = 3999744 Then ExitLoop
                $sKeyVal *= 2
                ReDim $aKeyValList[$sKeyVal + 1][4]
            EndIf
            $aKeyValList[$iKeyVal][0] = $aKeyList[$i]
            $iRegEnumVal += 1
            $sRegEnumVal = RegEnumVal($aKeyList[$i], $iRegEnumVal)
            If @Error <> 0 Then
                If $iRegEnumVal = 1 And $vFilter = "" Then $iKeyVal += 1
                ExitLoop
            EndIf
            $aKeyValList[$iKeyVal][2] = $sValueTypes[@Extended]
            If BitAND(@Extended, $iValueTypes) <> $iValueTypes Then ContinueLoop
            If $vFilter And Not StringRegExp($sRegEnumVal, $sFilter) Then ContinueLoop
            $aKeyValList[$iKeyVal][1] = $sRegEnumVal
            If $RegRead Then $aKeyValList[$iKeyVal][3] = RegRead($aKeyList[$i], $sRegEnumVal)
            $iKeyVal += 1
        WEnd
    Next
    $sRegEnumVal = $iKeyVal - Int(BitAND($iFlag, 32) = 0)
    If Not $sRegEnumVal Or ($sRegEnumVal = 1 And $vFilter = "" And $aKeyValList[$iKeyVal - $sRegEnumVal][2] = "") Then Return SetError(4, 0, "")
    ReDim $aKeyValList[$iKeyVal][4]
    If Not BitAND($iFlag, 32) Then $aKeyValList[0][0] = $iKeyVal - 1
    Return $aKeyValList
EndFunc

example

#RequireAdmin
#include <_RegEnumKeyValEx.au3>
#include <Array.au3>

Global $a, $t, $Error, $Extended, $KeyName
;$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft"
;$KeyName = "HKEY_CLASSES_ROOT"    ;104718
;$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes"
$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3"

$t = TimerInit()
;$a = _RegEnumKeyEx($KeyName, 0,  "Opti*Components")    ; to find HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OptionalComponents
;$a = _RegEnumKeyEx($KeyName, 0,  "*")
$a = _RegEnumKeyEx($KeyName,  128 + 256 + 32 + 16,  "*", "*vers*")
$Error = @Error
$Extended = @Extended
$t = TimerDiff($t)
ConsoleWrite("Timer = " & $t & @LF)
ConsoleWrite("Return = " & $a & " - $Error = " & $Error & " - $Extended = " & $Extended & @LF)
_ArrayDisplay($a)

;or
$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256)
;Return 2D array all Keys\Subkes\Values ect ect
_ArrayDisplay($a)

$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256, "*","*Ver*on*")
;Return $a[2][4] = [[1],["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]]
_ArrayDisplay($a)

$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256 + 32, "*","*ver*on*")
;Return $a[1][4] = [["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]]
_ArrayDisplay($a)

$a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256 + 16, "*","*ver*on*")
;Return @Error = 4 ($iFlag = 16 $sFilter do Case-Sensitive matching, Version <> version)
;_ArrayDisplay($a)

$a = _RegEnumValEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 256,"*Ver*on*")
;Return $a[2][4] = [[1],["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]]
_ArrayDisplay($a)

_RegEnumKeyValEx.au3

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Link to post
Share on other sites
  • 4 weeks later...
  • 2 weeks later...
  • 1 month later...
  • 3 weeks later...
  • 1 year later...

Thank you for the great script.

I have added to your example:

#include <_RegEnumKeyValEx.au3>

I have changed in your example line 19:

From:

_ArrayDisplay($a, $a1)

To

_ArrayDisplay($a)
 

Thank you,

Docfxit

Edited by Docfxit
Link to post
Share on other sites

Ive been working with this for uninstall keys and i wondered is there any way to have it show the ProgramName & InstallLocation keys in the array with the search?

because often they are msi uninstallers so i cant tell what they are for?

Code Im using

#RequireAdmin
#include <_RegEnumKeyValEx.au3>
#include <Array.au3>
Opt("TrayAutoPause",0)

Global $UninstallList
$sRegPath = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKCU64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'
;~ =================================================
Global $aRegPath = StringSplit($sRegPath, "|")
;~ _ArrayDisplay( $aRegPath)
;~ =================================================

Global $UninstallCheck, $UninstallKeys[0][4]
For $regloop = 1 To $aRegPath[0]
    If IsArray($aRegPath) Then
        $UninstallCheck = _RegEnumKeyEx($aRegPath[$regloop], 128 + 256, "*","*UninstallS*") ;*UninstallS*
        ConsoleWrite('UninstallCheck Is Array & @error = ' & @error & @CRLF)
;~         _ArrayDisplay($UninstallCheck, "To concatenate", Default, 8)
        _ArrayConcatenate($UninstallKeys, $UninstallCheck, 1) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        ConsoleWrite('UninstallArray & @error = ' & @error & @CRLF)
;~         _ArrayDisplay($UninstallKeys, "Concatenated", Default, 8)
    Else
        ConsoleWrite('UninstallCheck Not Array ' & @CRLF)
        ContinueLoop
    EndIf
Next
        _ArrayDisplay($UninstallKeys, "Concatenated", Default, 8)

This shows me all the uninstallers but not what they belong to

Suggestions?

Edited by Chimaera
Link to post
Share on other sites

Hi Chimaera, we are offtopic because this is not about the RegEnumKeyEx, but the msi setup http://technet.microsoft.com/en-us/library/bb892810.aspx

however here

#RequireAdmin
#include <_RegEnumKeyValEx.au3>
#include <Array.au3>

Global Const $sPatternGUID = "\{?(.)(.)(.)(.)(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\}?"
Global Const $sComponentIdPattern  = "$8$7$6$5$4$3$2$1$12$11$10$9$16$15$14$13$18$17$20$19$22$21$24$23$26$25$28$27$30$29$32$31"
;;Global Const $scGUIDPattern = "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)"
Global Const $sGUIDPattern  = "{$8$7$6$5$4$3$2$1-$12$11$10$9-$16$15$14$13-$18$17$20$19-$22$21$24$23$26$25$28$27$30$29$32$31}"

; #FUNCTION# =======================================================================================================================================================
; Name...........: _GetCompressedGUID
; Description ...: Connvert String GUID to String Compressed GUID
; Syntax.........: _GetCompressedGUID($sGUID[, $iFlags])
; Parameters ....: $sGUID - String GUID
;                  $iFlags - Optional, (Default = 0), if $iFlags $sGUID must be contain String Compressed GUID
; Return values .: String Product Properties, and set error
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:
; ==================================================================================================================================================================
Func _GetCompressedGUID($sGUID, $iFlags = 0)
    Return StringRegExpReplace($sGUID, $sPatternGUID, ($iFlags ? $sGUIDPattern : $sComponentIdPattern))
EndFunc


Global $aUninstallCheck, $aKeyList[1] = [0], $aMsiPath, $sMsiPath = "HKLM\SOFTWARE\Classes\Installer\Products\"
Global $aRegPath = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\|' & _
        'HKCU64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'
$aRegPath = StringSplit($aRegPath, "|")

For $i = 1 To $aRegPath[0]
    $aRegEnumKeyEx = _RegEnumKeyEx($aRegPath[$i], 256, "*","*") ;*UninstallS*
    If Not @Error Then
        ReDim $aKeyList[$aKeyList[0] + $aRegEnumKeyEx[0] + 1]
        For $y = 1 To $aRegEnumKeyEx[0]
            $aKeyList[$y + $aKeyList[0]] = $aRegEnumKeyEx[$y]
        Next
        $aKeyList[0] += $aRegEnumKeyEx[0]
    EndIf
Next
If $aKeyList[0] Then
    ;;_RegEnumValEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 256,"*Ver*on*") or _RegEnumValEx($aKey, 256,"*Ver*on*")
    $aUninstallCheck = _RegEnumValEx($aKeyList, 256, "*UninstallS*")
    If Not @Error Then
        For $i = 1 To $aUninstallCheck[0][0]
            $aMsiPath = StringRegExp($aUninstallCheck[$i][3], "^(?i)\h*MsiExec.exe\h+/\w\h*(\{[^\}]+\})", 1)
            If @Error then ContinueLoop
            ; Example
            ;; Example $DotNet4 = "HKLM\SOFTWARE\Classes\Installer\Products\%NetFX_Client_InstallerCode%"
            ;;RegRead($DotNet4, "AdvertiseFlags") - > %REG_DWORD%,"388"
            ;;RegRead($DotNet4, "Assignment") - > %REG_DWORD%,"1"
            ;;RegRead($DotNet4, "AuthorizedLUAApp") - > %REG_DWORD%,"0"
            ;;RegRead($DotNet4, "Clients") - > %REG_MULTI_SZ%,":"
            ;;RegRead($DotNet4, "InstanceType") - > %REG_DWORD%,"0"
            ;;RegRead($DotNet4, "Language") - > %REG_DWORD%,"0"
            ;;RegRead($DotNet4, "PackageCode") - > %REG_SZ%,"%NetFX_Client_PackageCode%"
            ;;RegRead($DotNet4, "ProductName", ,"%CoreProductName%"
            ;;RegRead($DotNet4, "Version") - > %REG_DWORD%,"67139183"
            ;;RegRead($DotNet4 & "\SourceList", "LastUsedSource") - > %REG_EXPAND_SZ%,"n;1;%SystemRoot%\Windows\Installer\"
            ;;RegRead($DotNet4 & "\SourceList", "PackageName") - > "netfx_Core_x86.msi"
            ;;RegRead($DotNet4 & "\SourceList\Media" ,"1") -> REG_SZ%";1"
            ;;RegRead($DotNet4 & "\SourceList\Net" ,"1") - > %REG_EXPAND_SZ%,"%SystemRoot%\Windows\Installer\"
            ;
            $aUninstallCheck[$i][3] &= @LF & RegRead($sMsiPath & _GetCompressedGUID($aMsiPath[0]) & "\SourceList", "PackageName")
            $aUninstallCheck[$i][3] &= @LF & StringRegExpReplace(RegRead($sMsiPath & _GetCompressedGUID($aMsiPath[0]) & "\SourceList", "LastUsedSource"), "^.*;(?=\w)", "")
            ;
            ;;$aTemp =  _RegEnumKeyEx($sMsiPath & _GetCompressedGUID($aMsiPath[0]), 128 + 256, "*","*")
            ;;If Not @Error Then
            ;;  $aTemp[0][1] = $aUninstallCheck[$i][3]
            ;;  $aUninstallCheck[$i][3] = $aTemp
            ;;EndIf
            ;;;; _ArrayDisplay($aUninstallCheck[$i][3])
        Next
    EndIf
EndIf
_ArrayDisplay($aUninstallCheck)

;~ For $i = 1 To $aUninstallCheck[0][0]
;~  If IsArray($aUninstallCheck[$i][3]) Then
;~      ;;msi mod
;~      $sUinstallComand = ($aUninstallCheck[$i][3])[0][1]
;~  Else
;~      ;;
;~  EndIf
;~ Next

Ciao.

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Link to post
Share on other sites

@OffTopic

Thats amazing i didnt even know they could be deciphered like that

Windows Installer GUID Compressed GUID

look also Darwin Descriptors

#Region ;Encoding-Decoding Base85

;; tables for encoding and decoding base85
Global Const $aTable_Dec85[0x80] = [ _
    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, _
    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, _
    0xff,0x00,0xff,0xff,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0xff, _
    0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0xff,0xff,0xff,0x16,0xff,0x17, _
    0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, _
    0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0x34,0x35,0x36, _
    0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46, _
    0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xff,0x53,0x54,0xff]
Global Const $aTable_Enc85[85] = [ _
    "!","$","%","&","'","(",")","*","+",",","-",".","0","1","2","3","4","5","6","7","8", _
    "9","=","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q", _
    "R","S","T","U","V","W","X","Y","Z","[","]","^","_","`","a","b","c","d","e","f","g", _
    "h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","}","~"]


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Decode_Base85_GUID
; Description ...: Converts a (base85 encoded GUID) Darwin Descriptor into a StringGUID, String Base85 encoded GUIDs should be 20 characters long.
; Syntax.........: _Decode_Base85_GUID($sDarwinDes)
; Parameters ....: $sDarwinDes   - String (base85 encoded) Darwin Descriptor
; Return values .: If the function succeeds, return StringGUID. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Decode_Base85_GUID($sDarwinDes)
    Local $dData = 0, $dBase = 1, $tGUID = DllStructCreate("struct; ulong Data1;ulong Data2;ulong Data3;ulong Data4;endstruct")
    If StringLen($sDarwinDes) < 20 Then Return SetError(1, 0, False)
    $sDarwinDes = StringToASCIIArray($sDarwinDes)
    For $i = 0 to 19 Step 5
        $dData = 0
        $dBase = 1
        For $y = $i To $i + 4
            $dData += $aTable_Dec85[$sDarwinDes[$y]] * $dBase
            If $sDarwinDes[$y] >= 0x80 Then Return SetError(2, 0, False)
            If $sDarwinDes[$y] = 0xff Then Return SetError(3, 0, False)
            $dBase *= 85
        Next
        DllStructSetData($tGUID, Round($i/5) + 1, $dData)
    Next
    Local $aResult = DllCall("ole32.dll", "int", "StringFromGUID2", "struct*", $tGUID, "wstr", "", "int", 40)
    If @Error Or Not $aResult[0] Then Return SetError(@error, @extended, False)
    Return $aResult[2]
EndFunc


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Decode_Base85_GUIDEx
; Description ...: Converts a (base85 encoded GUID) Darwin Descriptor into a StringGUID, String Base85 encoded GUIDs should be 20 characters long.
; Syntax.........: _Decode_Base85_GUID($sDarwinDes)
; Parameters ....: $sDarwinDes   - String (base85 encoded) Darwin Descriptor
; Return values .: If the function succeeds, return StringGUID. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Decode_Base85_GUIDEx($sDarwinDes)
    Local $dData = 0, $dBase = 1, $aGUID[5]
    If StringLen($sDarwinDes) < 20 Then Return SetError(1, 0, False)
    $sDarwinDes = StringToASCIIArray($sDarwinDes)
    For $i = 0 to 19 Step 5
        $dData = 0
        $dBase = 1
        For $y = $i To $i + 4
            $dData += $aTable_Dec85[$sDarwinDes[$y]] * $dBase
            If $sDarwinDes[$y] >= 0x80 Then Return SetError(2, 0, False)
            If $sDarwinDes[$y] = 0xff Then Return SetError(3, 0, False)
            $dBase *= 85
        Next
        $aGUID[$i/5] = $dData
        $aGUID[4] &= Hex($dData, 8)
    Next
    Return StringRegExpReplace($aGUID[4], "(.{8})(.{4})(.{4})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})",  "{$1-$3-$2-$7$6-$5$4$11$10$9$8}")
EndFunc


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Encode_Base85_GUID
; Description ...: Converts a StringGUID into a String (base85 encoded) Darwin Descriptor
; Syntax.........: _Encode_Base85_GUID($sGUID)
; Parameters ....: $sGUID        - String GUID
; Return values .: If the function succeeds, return String (base85 encoded) Darwin Descriptor. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Encode_Base85_GUID($sGUID)
    Local $sDD_GUID, $dData, $tGUID = DllStructCreate("struct; ulong Data1;ulong Data2;ulong Data3;ulong Data4;endstruct")
    Local $aResult = DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", $sGUID, "struct*", $tGUID)
    If @Error Then Return SetError(@error, @extended, False)
    ;;Local $sDD_GUID, $dData, $tGUID = DllStructCreate("struct; ulong Data1;ushort Data2;ushort Data3;byte Data4[8]; endstruct")
    ;;Local $aResult = DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", $sGUID, "struct*", $tGUID)
    ;;If @Error Then Return SetError(@error, @extended, False)
    ;;$tGUID = DllStructCreate("ulong Data1;ulong Data2;ulong Data3;ulong Data4", DllStructGetPtr($tGUID))
    For $i = 1 to 4
        $dData = DllStructGetData($tGUID, $i)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
    Next
    Return $sDD_GUID
EndFunc


; #FUNCTION# =======================================================================================================================================================
; Name...........: _Encode_Base85_GUIDEx
; Description ...: Converts a StringGUID into a String (base85 encoded) Darwin Descriptor
; Syntax.........: _Encode_Base85_GUIDEx($sGUID)
; Parameters ....: $sGUID        - String GUID
; Return values .: If the function succeeds, return String (base85 encoded) Darwin Descriptor. If the function fails, return False
; Author ........: DXRW4E
; Modified.......:
; Remarks .......:
; Link ..........:
; Example .......:
; Note ..........:  This function was inspired by ReactOS Project
;                   http://www.reactos.org/
;                  * Copyright 2002-2005 Mike McCormack for CodeWeavers
;                  * Copyright 2005 Aric Stewart for CodeWeavers
; ==================================================================================================================================================================
Func _Encode_Base85_GUIDEx($sGUID)
    Local $sDD_GUID, $dData, $aGUID = StringRegExp($sGUID, "\{?([0-9A-Fa-f]{8})-?([0-9A-Fa-f]{4})-?([0-9A-Fa-f]{4})-?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})-?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})", 1)
    If @Error Then Return SetError(@error, @extended, False)
    $aGUID[0] = Number("0x" & $aGUID[0], 3)
    $aGUID[1] = Number("0x" & $aGUID[2] & $aGUID[1], 3)
    $aGUID[2] = Number("0x" & $aGUID[6] & $aGUID[5] & $aGUID[4] & $aGUID[3], 3)
    $aGUID[3] = Number("0x" & $aGUID[10] & $aGUID[9] & $aGUID[8] & $aGUID[7], 3)
    For $i = 0 to 3
        $dData = $aGUID[$i]
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
        $dData = Int($dData / 85)
        $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)]
    Next
    Return $sDD_GUID
EndFunc


#EndRegion ;Encoding-Decoding Base85
Ciao. Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Link to post
Share on other sites
  • 1 year later...

@DXRW4E Is it possible to return only if the Default valuename contains ValueData?  I tried with setting the $sFilter to "" and using "*" but both return all Values in the path. I also tried "(Default)" which doesn't return anything. I know if I use RegRead([Path], "") get the default value.  But it doesn't seem to work as intended with this function.

 

To access the (Default) value use "" (an empty string) for the valuename.
 

Update:  I think I figured out what to edit.  Here is my modified function:

Func _RegEnumValEx($aKeyList, $iFlag = 0, $sFilter = "*", $iValueTypes = 0)
    If StringRegExp($sFilter, "\v") Then Return SetError(3, 0, "")
    If Not IsArray($aKeyList) Then $aKeyList = StringSplit($aKeyList, @LF)
    Local $aKeyValList[1954][4], $iKeyVal = Int(BitAND($iFlag, 32) = 0), $sKeyVal = 1953, $sRegEnumVal, $iRegEnumVal, $RegRead = BitAND($iFlag, 256), $vFilter = StringReplace($sFilter, "*", "")
    If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")"
    For $i = 1 To $aKeyList[0]
        $iRegEnumVal = 0
        While 1
            If $sFilter = "(?i)()" And $iRegEnumVal > 0 Then ExitLoop
            If $iKeyVal = $sKeyVal Then
                If $sKeyVal = 3999744 Then ExitLoop
                $sKeyVal *= 2
                ReDim $aKeyValList[$sKeyVal + 1][4]
            EndIf
            $aKeyValList[$iKeyVal][0] = $aKeyList[$i]
            $iRegEnumVal += 1
            $sRegEnumVal = RegEnumVal($aKeyList[$i], $iRegEnumVal)
            If @Error <> 0 Then
                If $iRegEnumVal = 1 And $vFilter = "" Then $iKeyVal += 1
                ExitLoop
            EndIf
            If $sFilter = "(?i)()" And $sRegEnumVal <> "" Then ExitLoop
            If BitAND(@Extended, $iValueTypes) <> $iValueTypes Then ContinueLoop
            If $vFilter And Not StringRegExp($sRegEnumVal, $sFilter) Then ContinueLoop
            $aKeyValList[$iKeyVal][1] = $sRegEnumVal
            If $RegRead Then $aKeyValList[$iKeyVal][2] = RegRead($aKeyList[$i], $sRegEnumVal)
            $iKeyVal += 1
        WEnd
    Next
    $sRegEnumVal = $iKeyVal - Int(BitAND($iFlag, 32) = 0)
    If Not $sRegEnumVal Or ($sRegEnumVal = 1 And $vFilter = "" And $aKeyValList[$iKeyVal - $sRegEnumVal][2] = "") Then Return SetError(4, 0, "")
    ReDim $aKeyValList[$iKeyVal][4]
    If Not BitAND($iFlag, 32) Then $aKeyValList[0][0] = $iKeyVal - 1
    Return $aKeyValList
EndFunc

Just use "" as the $sFilter and it should now only return the (Default) Values. ;)

Edited by Proph
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Hermes
      Hi, sometimes when I run my script in GUI (SciTe Editor) or as an executable file, the chrome driver launches but the chrome browser does not but when I re-run the script again - chrome driver launches and so does the browser. Here is the error that I'm getting:
      __WD_Post: StatusCode=0; ResponseText=WinHTTP request timed out before Webdriver... __WD_Post ==> Send / Recv error: WinHTTP request timed out before Webdriver _WD_CreateSession: WinHTTP request timed out before Webdriver _WD_CreateSession ==> Webdriver Exception: HTTP status = 0 Just wondering if there's a way to re-launch both the driver and browser without having to rerun the script/executable.
       
       
    • By Hermes
      Hello, the script below will read column A from an excel file - and if a value matches in the browser, it will click the corresponding link and click on a specific button to paste the data, then writes "Completed" in Column B. It will continue to read from the excel file and do the same thing for all the remaining rows.
      #Include "Chrome.au3" #Include "wd_core.au3" #Include "wd_helper.au3" #Include "WinHttp.au3" #include <MsgBoxConstants.au3> #include <File.au3> #include <IE.au3> #include <Array.au3> #include <INet.au3> #include <AutoItConstants.au3> #include <WinAPIFiles.au3> #include <GDIPlus.au3> #include <Excel.au3> #Include "WinHttp.au3" #Include "_HtmlTable2Array.au3" Local $sDesiredCapabilities, $sSession SetupChrome() _WD_Startup() $sSession = _WD_CreateSession($sDesiredCapabilities) _WD_LoadWait($sSession) _WD_Navigate($sSession, "table1.html") _WD_LoadWait($sSession) _WD_WaitElement($sSession, $_WD_LOCATOR_ByXPath, "//table[@class='main']") Local $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//table[@class='main']") ;ConsoleWrite ("mat-table " & $sElement & @CRLF) Local $aArray1 = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, ".//td[contains(@class,'data')]", $sElement, True) sleep(1000) For $i = 0 to UBound($aArray1) - 1 $aArray1[$i] = _WD_ElementAction($sSession, $aArray1[$i], 'text') Next ;_ArrayDisplay($aArray1) ;Email variables $SmtpServer = "" ; address for the smtp-server to use - REQUIRED $FromName = "Hermes" ; name from who the email was sent $FromAddress = "sender@gmail.com" ; address from where the mail should come $ToAddress = "recipient@gmail.com" ; destination address of the email - REQUIRED, use commas (,) to add more email addresses $Subject = "File not found" ; subject from the email - can be anything you want it to be $Body = "File not found!" ; the messagebody from the mail - can be left blank but then you get a blank mail $AttachFiles = "" ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed $CcAddress = "" ; address for cc - leave blank if not needed $BccAddress = "" ; address for bcc - leave blank if not needed $Importance = "High" ; Send message priority: "High", "Normal", "Low" $Username = "" ; username for the account used from where the mail gets sent - REQUIRED $Password = "" ; password for the account used from where the mail gets sent - REQUIRED $IPPort = 25 ; port used for sending the mail $ssl = 0 ; enables/disables secure socket layer sending - put to 1 if using httpS $tls = 0 ; enables/disables TLS when required Local $oAppl = _Excel_Open() Local $sWorkbook = "c:\test.xlsx" Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook) ;open excel and pass both parameters If FileExists($sWorkbook) Then ;Check if the file exist. Local $oAppl = _Excel_Open() Local $sWorkbook = "c:\test.xlsx" Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook) ;open excel and pass both parameters Local $aArray2 = _Excel_RangeRead($oWorkbook,Default,$oWorkbook.ActiveSheet.Usedrange.Columns("A:A")) Local $iIdx Local $Skipline = 0 ;0==> first line Do Local $temprf For $i = 0 To UBound($aArray2) - 1 $temprf &= $aArray2[$i] _WD_WaitElement($sSession, $_WD_LOCATOR_ByXPath, ".//a[contains(@class,'edit') and contains(text(),'Edit')]") Local $aElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, ".//a[contains(@class,'edit') and contains(text(),'Edit')]", $sElement, True) $iIdx = _ArraySearch($aArray1, $aArray2[$i]) If @error Then ContinueLoop _WD_ElementAction($sSession, $aElement[$iIdx], 'click') If $i < $Skipline Then ContinueLoop $oRange = $oWorkbook.ActiveSheet.Range("B" & $i + 1 & ":XFD" & $i + 1) _Excel_RangeCopyPaste($oWorkbook.Activesheet, $oRange) ;Paste Local $oTest4 = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "pastebutton") _WD_ElementAction($sSession, $oTest4, 'click') Sleep(1000) ;Save Button Local $save3 = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "button.button") _WD_ElementAction($sSession, $save3, 'click') _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, "Completed", "B" & $i+1) sleep(1000) Next Until (Not @error) _Excel_Close($oWorkbook) Else _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl, $tls) Exit EndIf _WD_LoadWait($sSession) ;Attaching files to emails Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0, $tls = 0) Local $objEmail = ObjCreate("CDO.Message") $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>' $objEmail.To = $s_ToAddress Local $i_Error = 0 Local $i_Error_desciption = "" If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress $objEmail.Subject = $s_Subject If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then $objEmail.HTMLBody = $as_Body Else $objEmail.Textbody = $as_Body & @CRLF EndIf $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer If Number($IPPort) = 0 then $IPPort = 25 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort ;Authenticated SMTP If $s_Username <> "" Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password EndIf ; Set security params If $ssl Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True If $tls Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendtls") = True ;Update settings $objEmail.Configuration.Fields.Update ; Set Email Importance Switch $s_Importance Case "High" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High" Case "Normal" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal" Case "Low" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low" EndSwitch $objEmail.Fields.Update ; Sent the Message $objEmail.Send $objEmail="" EndFunc ;==>_INetSmtpMailCom Local $aDir = _FileListToArrayRec(@TempDir, "scoped_dir*;chrome_*", $FLTAR_FOLDERS, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) Sleep(2000) For $i = 1 To $aDir[0] DirRemove($aDir[$i], $DIR_REMOVE) Next _WD_LoadWait($sSession) _WD_Shutdown() Func SetupChrome() _WD_Option('Driver', 'chromedriver.exe') _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true, "args":["start-maximized","disable-infobars"]}}}}' EndFunc ;==>SetupChrome If the excel file doesn't exists in the folder, it will send an email to a specific recipient.
      What i am trying figure out now is if the excel crashes while the script/loop is running, I want to relaunch the excel file continue to the last row before the excel crashed. So if the value of column B is not marked as "completed", it should continue from that row
      Appreciate any help that I can get to achieve this.
      table1.html test.xlsx
    • By vinnyMS
      #Include <Array.au3> #include <Constants.au3> $s = FileRead("2.txt") Local $w = StringRegExp($s, '(?is)(\b\w+\b)(?!.*\b\1\b)', 3) _ArrayColInsert($w, 1) For $i = 0 to UBound($w)-1 StringRegExpReplace($s, '(?i)\b' & $w[$i][0] & '\b', $w[$i][0]) $w[$i][1] = @extended Next _ArraySort($w, 1, 0, 0, 1) _ArrayDisplay($w) i have this script that returns 3 columns  
       
      i need to copy the  Col 0 and Col 1 as text to paste on notepad or excel
      you will have to create a "copy" button if possible
      array.au3 2.txt
    • By DannyJ
      I have a dataset like this, (a strubg)
      Username: User1 Type: Admin RegDate: 1999 Username: User2 Type: User RegDate: 2000 How to make a 2 dimensional array that I can display with _ArrayDisplay?
      This would be a perfect 2D array to represent my data:
      Username           Tpye RegDate User1              Admin 1999 User2              User 2000   If you run this Powershell this powershell command, you can get this dataset that I am talking about:
      Get-LocalUser | Select * With this code you can try it to read into a string:
      #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include "GUIListViewEx.au3" #include <Array.au3> ; Just for display in example #RequireAdmin #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_UseX64=y #EndRegion $sCommand = "powershell.exe Get-LocalUser | Select *" Local $iPid = Run($sCommand, @WorkingDir , @SW_SHOW , $STDOUT_CHILD) ProcessWaitClose($iPid) Local $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput) How can I correctly split $sOutput into a 2D array (with the above mentioned layout) that I can display and I work with?
    • By kovlad
      My solution is to write nested arrays without copying.
      The problem was described hier.
       
      Function:
      #include <Array.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ArrayNestedSet ; Description ...: Assigns a value to an element of a nested 1D array. ; Syntax ........: _ArrayNestedSet(ByRef $aArray, $vIndex, $vValue) ; Parameters ....: $aArray - an array of arrays. ; $vIndex - an index or 1d-array of indexes; ; a size if $vValue not defined (zero to delete). ; $vValue - a value (create, resize or delete if not defined). ; ; Return values .: on success - 1 ; @extended - nesting level of operation ; on failure - 0 ; @extended - nesting level of error ; @error = 1 - invalid array ; @error = 2 - invalid index ; Author ........: ; Modified ......: kovlad ; Remarks .......: ; Related .......: ; Link ..........: https://www.autoitscript.com/forum/topic/185638-assign-a-value-to-an-array-in-array-element/ ; https://www.autoitscript.com/trac/autoit/ticket/3515?replyto=description ; Example .......: Yes ; =============================================================================================================================== Func _ArrayNestedSet(ByRef $aArray, $vIndex, $vValue = Default) Local $extended = @extended + 1 If IsArray($vIndex) Then If UBound($vIndex, 0) <> 1 Then _ Return SetError(2, $extended) If UBound($vIndex) > 1 Then If UBound($aArray, 0) <> 1 Then _ Return SetError(1, $extended) ; keep index for this array Local $i = $vIndex[0] If $i < 0 Or UBound($aArray) <= $i Then _ Return SetError(2, $extended) ; delete index of this array _ArrayDelete($vIndex, 0) ; recursive function call Local $return = _ArrayNestedSet($aArray[$i], $vIndex, $vValue) If @error Then Return SetError(@error, @extended + 1, 0) Else Return SetExtended(@extended + 1, 1) EndIf Else $vIndex = $vIndex[0] EndIf EndIf If $vValue = Default Then If $vIndex < 0 Then _ Return SetError(2, $extended) If $vIndex = 0 Then ; delete array and free memory $aArray = 0 Return SetExtended($extended, 1) EndIf If UBound($aArray, 0) = 1 Then ; resize array keeping data ReDim $aArray[$vIndex] Return SetExtended($extended, 1) Else ; create new nested array Local $aTmp[$vIndex] $aArray = $aTmp Return SetExtended($extended, 1) EndIf Else If UBound($aArray) <= $vIndex Then _ Return SetError(2, $extended + 1) ; set value of array entry $aArray[$vIndex] = $vValue Return SetExtended($extended, 1) EndIf EndFunc  
      Examples:
      ; write value to 1st nested array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : write value to 1st nested array" & @CRLF) Local $aTmp1[4] = [1,2,3,4] _ArrayDisplay($aTmp1, "$aTmp1") Local $aArray[2] = [$aTmp1] ConsoleWrite( _ "_ArrayNestedSet($aArray[0], 3, 14) = " & _ArrayNestedSet($aArray[0], 3, 14) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF & @CRLF) _ArrayDisplay($aArray[0], "$aArray[0]") ; resize 1st nested array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : resize 1st nested array" & @CRLF) ConsoleWrite( _ "_ArrayNestedSet($aArray[0], 8) = " & _ArrayNestedSet($aArray[0], 8) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF & @CRLF) _ArrayDisplay($aArray[0], "$aArray[0]") ; write array to 1st nested array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : write array to 1st nested array" & @CRLF) Local $aTmp11[4] = [11,12,13,14] _ArrayDisplay($aTmp11, "$aTmp11") ConsoleWrite( _ "_ArrayNestedSet($aArray[0], 2, $aTmp11) = " & _ArrayNestedSet($aArray[0], 2, $aTmp11) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF & @CRLF) _ArrayDisplay(($aArray[0])[2], "($aArray[0])[2]") ; write value to 2nd nested array using index array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : write value to 2nd nested array using index array" & @CRLF) Local $aIndex1[2] = [2,3] _ArrayDisplay($aIndex1, "$aIndex1") ConsoleWrite( _ "_ArrayNestedSet($aArray[0], $aIndex1, 140) = " & _ArrayNestedSet($aArray[0], $aIndex1, 140) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF & @CRLF) _ArrayDisplay(($aArray[0])[2], "($aArray[0])[2]") ; resize 2nd nested array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : resize 2nd nested array" & @CRLF) Local $aIndex1[2] = [2,8] _ArrayDisplay($aIndex1, "$aIndex1") ConsoleWrite( _ "_ArrayNestedSet($aArray[0], $aIndex1) = " & _ArrayNestedSet($aArray[0], $aIndex1) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF & @CRLF) _ArrayDisplay(($aArray[0])[2], "($aArray[0])[2]") ; create new 3rd nested array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : create new 3rd nested array" & @CRLF) Local $aIndex2[3] = [2,7,6] _ArrayDisplay($aIndex2, "$aIndex2") ConsoleWrite( _ "_ArrayNestedSet($aArray[0], $aIndex2) = " & _ArrayNestedSet($aArray[0], $aIndex2) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF & @CRLF) _ArrayDisplay((($aArray[0])[2])[7], ")($aArray[0])[2])[7]") ; delete 3rd nested array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : delete 3rd nested array" & @CRLF) Local $aIndex3[3] = [2,7,0] _ArrayDisplay($aIndex3, "$aIndex2") ConsoleWrite( _ "_ArrayNestedSet($aArray[0], $aIndex3) = " & _ArrayNestedSet($aArray[0], $aIndex3) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF) ConsoleWrite("IsArray((($aArray[0])[2])[7]) = " & IsArray((($aArray[0])[2])[7]) & @CRLF & @CRLF) ; write 0 in 1st nested array to delete the 2nd nested array ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : write 0 in 1st nested array to delete the 2nd nested array" & @CRLF) Local $aIndex4[1] = [2] _ArrayDisplay($aIndex4, "$aIndex4") ConsoleWrite( _ "_ArrayNestedSet($aArray[0], $aIndex4, 0) = " & _ArrayNestedSet($aArray[0], $aIndex4, 0) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF) ConsoleWrite("IsArray(($aArray[0])[2]) = " & IsArray(($aArray[0])[2]) & @CRLF & @CRLF) ; delete 1st nested array (same as '$aArray[0] = 0') ConsoleWrite("@@ Debug(" & @ScriptLineNumber & ") : delete 1st nested array (same as '$aArray[0] = 0')" & @CRLF) Local $aIndex5[1] = [0] _ArrayDisplay($aIndex5, "$aIndex5") ConsoleWrite( _ "_ArrayNestedSet($aArray[0], $aIndex5) = " & _ArrayNestedSet($aArray[0], $aIndex5) & @CRLF & _ " @error = " & @error & @CRLF & _ " @extended = " & @extended & @CRLF) ConsoleWrite("IsArray($aArray[0]) = " & IsArray($aArray[0]) & @CRLF & @CRLF)  
×
×
  • Create New...