Sign in to follow this  
Followers 0
DXRW4E

_RegEnumKeyValEx (_RegEnumKeyEx & _RegEnumValEx)

16 posts in this topic

#1 ·  Posted (edited)

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

Share this post


Link to post
Share on other sites



DXRW4W,

really nice - thanks for sharing! :)

Share this post


Link to post
Share on other sites

Updated, Added $sFilter Case-sensitivity flag & Disable the return the count in the first element, for more see the first post

Ciao.


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

Share this post


Link to post
Share on other sites

This is so awesome! What are the chances, because I have been trying to figure this out all day yesterday and now you've come along and made my life a million times easier!

Thank you!

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

@jazzyjeff

Thank You, You are welcome

@All

Updated, add $iFlag = 64 now you can use the $sFilter in RegExp Mod (See Pattern Parameters in StringRegExp )

Ciao.

Edited by DXRW4E

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

Share this post


Link to post
Share on other sites

DXRW4E

Is there any chance you could add an option to return all sub values as well into a 2d array?

This would make this function perfect!

Share this post


Link to post
Share on other sites

already done

Ciao.


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

Share this post


Link to post
Share on other sites

Updated, add flags $iValueTypes

Ciao.


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

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

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

Share this post


Link to post
Share on other sites

Hi Docfxit, Thank you for reporting, already editupdated the example script

Ciao.


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

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

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

Share this post


Link to post
Share on other sites

#13 ·  Posted (edited)

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

Share this post


Link to post
Share on other sites

#15 ·  Posted (edited)

@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

Share this post


Link to post
Share on other sites

#16 ·  Posted (edited)

@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

Share this post


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
Sign in to follow this  
Followers 0

  • Similar Content

    • FrancescoDiMuro
      By FrancescoDiMuro
      Good morning everyone
      I'm working on a little project, and, I encountered a little strange error when I try to add some data to an array...
      The code I wrote is this:
      Func _WMI_Get_Win32_TemperatureProbe($blnCanUseWMI, $blnCustomArrayDisplay = False, $blnReturnEU = False) If $blnCanUseWMI Then Local $objWMI_QueryResult = $objWMI.ExecQuery("SELECT * FROM Win32_TemperatureProbe", "WQL", 32) If @error Then __ConsoleWrite("Error executing the query on Win32_TemperatureProbe class.", @error, 9999) Else Local $arrWin32_TemperatureProbe[1][3] _ArrayDelete($arrWin32_TemperatureProbe, 0) If @error Then __ConsoleWrite("Error deleting the 0st element $arrWin32_TemperatureProbe array.", @error, 9999) Else Local $objWMI_Variable = Null, $strWMI_QueryResult = "", $i = 0 For $objWMI_Variable In $objWMI_QueryResult $strWMI_QueryResult &= "QUERY RESULT" & "|# " & $i & "|/" & @CRLF & _ "Accuracy" & "|" & $objWMI_Variable.Accuracy & "|" & "[sint32]" & @CRLF & _ "Availability" & "|" & $objWMI_Variable.Availability & "|" & "[uint16]" & @CRLF & _ "Caption" & "|" & $objWMI_Variable.Caption & "|" & "[string]" & @CRLF & _ "ConfigManagerErrorCode" & "|" & $objWMI_Variable.ConfigManagerErrorCode & "|" & "[uint32]" & @CRLF & _ "ConfigManagerUserConfig" & "|" & $objWMI_Variable.ConfigManagerUserConfig & "|" & "[boolean]" & @CRLF & _ "CreationClassName" & "|" & $objWMI_Variable.CreationClassName & "|" & "[string]" & @CRLF & _ "CurrentReading" & "|" & $objWMI_Variable.CurrentReading & "|" & "[sint32]" & @CRLF & _ "Description" & "|" & $objWMI_Variable.Description & "|" & "[string]" & @CRLF & _ "DeviceID" & "|" & $objWMI_Variable.DeviceID & "|" & "[string]" & @CRLF & _ "ErrorCleared" & "|" & $objWMI_Variable.ErrorCleared & "|" & "[boolean]" & @CRLF & _ "ErrorDescription" & "|" & $objWMI_Variable.ErrorDescription & "|" & "[string]" & @CRLF & _ "InstallDate" & "|" & $objWMI_Variable.InstallDate & "|" & "[datetime]" & @CRLF & _ "IsLinear" & "|" & $objWMI_Variable.IsLinear & "|" & "[boolean]" & @CRLF & _ "LastErrorCode" & "|" & $objWMI_Variable.LastErrorCode & "|" & "[uint32]" & @CRLF & _ "LowerThresholdCritical" & "|" & $objWMI_Variable.LowerThresholdCritical & "|" & "[sint32]" & @CRLF & _ "LowerThresholdFatal" & "|" & $objWMI_Variable.LowerThresholdFatal & "|" & "[sint32]" & @CRLF & _ "LowerThresholdNonCritical" & "|" & $objWMI_Variable.LowerThresholdNonCritical & "|" & "[sint32]" & @CRLF & _ "MaxReadable" & "|" & $objWMI_Variable.MaxReadable & "|" & "[sint32]" & @CRLF & _ "MinReadable" & "|" & $objWMI_Variable.MinReadable & "|" & "[sint32]" & @CRLF & _ "Name" & "|" & $objWMI_Variable.Name & "|" & "[string]" & @CRLF & _ "NominalReading" & "|" & $objWMI_Variable.NominalReading & "|" & "[sint32]" & @CRLF & _ "NormalMax" & "|" & $objWMI_Variable.NormalMax & "|" & "[sint32]" & @CRLF & _ "NormalMin" & "|" & $objWMI_Variable.NormalMin & "|" & "[sint32]" & @CRLF & _ "PNPDeviceID" & "|" & $objWMI_Variable.PNPDeviceID & "|" & "[string]" & @CRLF & _ "PowerManagementCapabilities" & "|" & $objWMI_Variable.PowerManagementCapabilities & "|" & "[uint16]" & @CRLF & _ "PowerManagementSupported" & "|" & $objWMI_Variable.PowerManagementSupported & "|" & "[boolean]" & @CRLF & _ "Resolution" & "|" & $objWMI_Variable.Resolution & "|" & "[uint32]" & @CRLF & _ "Status" & "|" & $objWMI_Variable.Status & "|" & "[string]" & @CRLF & _ "StatusInfo" & "|" & $objWMI_Variable.StatusInfo & "|" & "[uint16]" & @CRLF & _ "SystemCreationClassName" & "|" & $objWMI_Variable.SystemCreationClassName & "|" & "[string]" & @CRLF & _ "SystemName" & "|" & $objWMI_Variable.SystemName & "|" & "[string]" & @CRLF & _ "Tolerance" & "|" & $objWMI_Variable.Tolerance & "|" & "[sint32]" & @CRLF & _ "UpperThresholdCritical" & "|" & $objWMI_Variable.UpperThresholdCritical & "|" & "[sint32]" & @CRLF & _ "UpperThresholdFatal" & "|" & $objWMI_Variable.UpperThresholdFatal & "|" & "[sint32]" & @CRLF & _ "UpperThresholdNonCritical" & "|" & $objWMI_Variable.UpperThresholdNonCritical & "|" & "[sint32]" $i+=1 Next ConsoleWrite($strWMI_QueryResult & @CRLF) _ArrayAdd($arrWin32_TemperatureProbe, $strWMI_QueryResult) ; I'll wait for an answer... See you later :) If @error Then __ConsoleWrite("Error inserting item #" & $i & " in the $arrWin32_TemperatureProbe array.", @error, 9999) Else If $blnCustomArrayDisplay Then _ArrayDisplay($arrWin32_TemperatureProbe, "Win32_TemperatureProbe:", "", 64 + 32 + 4, "|", "VARIABLE NAME|ACTUAL VALUE|ENGINEERING UNIT", 350, 0xD3D3D3) If @error Then __ConsoleWrite("Error displaying the $arrWin32_TemperatureProbe array.", @error, 9999) EndIf EndIf If $blnReturnEU = False Then _ArrayColDelete($arrWin32_TemperatureProbe, 2) If @error Then __ConsoleWrite("Error deleting the column #2 of $arrWin32_TemperatureProbe array.") EndIf EndIf If IsArray($arrWin32_TemperatureProbe) Then Return $arrWin32_TemperatureProbe Else Return False EndIf EndIf EndIf EndIf EndIf EndFunc And I get this error ( undocumented in the Help File on _ArrayAdd() function ):
      [15/09/2017 10:24:46] : Error inserting item #4 in the $arrWin32_TemperatureProbe array. > Error: 0 Adding a ConsoleWrite() before the _ArrayAdd() function, I can see the content of $strWMI_QueryResult, and, here it is:
      QUERY RESULT|# 0|/
      Accuracy|32768|[sint32]
      Availability||[uint16]
      Caption|Sensore numerico|[string]
      ConfigManagerErrorCode||[uint32]
      ConfigManagerUserConfig||[boolean]
      CreationClassName|Win32_TemperatureProbe|[string]
      CurrentReading||[sint32]
      Description|CPU Thermal Probe|[string]
      DeviceID|root\cimv2 0|[string]
      ErrorCleared||[boolean]
      ErrorDescription||[string]
      InstallDate||[datetime]
      IsLinear||[boolean]
      LastErrorCode||[uint32]
      LowerThresholdCritical||[sint32]
      LowerThresholdFatal||[sint32]
      LowerThresholdNonCritical||[sint32]
      MaxReadable|1270|[sint32]
      MinReadable|64266|[sint32]
      Name|Sensore numerico|[string]
      NominalReading||[sint32]
      NormalMax||[sint32]
      NormalMin||[sint32]
      PNPDeviceID||[string]
      PowerManagementCapabilities||[uint16]
      PowerManagementSupported||[boolean]
      Resolution|1000|[uint32]
      Status|Unknown|[string]
      StatusInfo||[uint16]
      SystemCreationClassName|Win32_ComputerSystem|[string]
      SystemName|DESKTOP-25LFPVU|[string]
      Tolerance|32768|[sint32]
      UpperThresholdCritical||[sint32]
      UpperThresholdFatal||[sint32]
      UpperThresholdNonCritical||[sint32]QUERY RESULT|# 1|/
      Accuracy|32768|[sint32]
      Availability||[uint16]
      Caption|Sensore numerico|[string]
      ConfigManagerErrorCode||[uint32]
      ConfigManagerUserConfig||[boolean]
      CreationClassName|Win32_TemperatureProbe|[string]
      CurrentReading||[sint32]
      Description|True Ambient Thermal Probe|[string]
      DeviceID|root\cimv2 1|[string]
      ErrorCleared||[boolean]
      ErrorDescription||[string]
      InstallDate||[datetime]
      IsLinear||[boolean]
      LastErrorCode||[uint32]
      LowerThresholdCritical||[sint32]
      LowerThresholdFatal||[sint32]
      LowerThresholdNonCritical||[sint32]
      MaxReadable|1270|[sint32]
      MinReadable|64266|[sint32]
      Name|Sensore numerico|[string]
      NominalReading||[sint32]
      NormalMax||[sint32]
      NormalMin||[sint32]
      PNPDeviceID||[string]
      PowerManagementCapabilities||[uint16]
      PowerManagementSupported||[boolean]
      Resolution|1000|[uint32]
      Status|Unknown|[string]
      StatusInfo||[uint16]
      SystemCreationClassName|Win32_ComputerSystem|[string]
      SystemName|DESKTOP-25LFPVU|[string]
      Tolerance|32768|[sint32]
      UpperThresholdCritical||[sint32]
      UpperThresholdFatal||[sint32]
      UpperThresholdNonCritical||[sint32]QUERY RESULT|# 2|/
      Accuracy|32768|[sint32]
      Availability||[uint16]
      Caption|Sensore numerico|[string]
      ConfigManagerErrorCode||[uint32]
      ConfigManagerUserConfig||[boolean]
      CreationClassName|Win32_TemperatureProbe|[string]
      CurrentReading||[sint32]
      Description|Memory Module Thermal Probe|[string]
      DeviceID|root\cimv2 2|[string]
      ErrorCleared||[boolean]
      ErrorDescription||[string]
      InstallDate||[datetime]
      IsLinear||[boolean]
      LastErrorCode||[uint32]
      LowerThresholdCritical||[sint32]
      LowerThresholdFatal||[sint32]
      LowerThresholdNonCritical||[sint32]
      MaxReadable|1270|[sint32]
      MinReadable|64266|[sint32]
      Name|Sensore numerico|[string]
      NominalReading||[sint32]
      NormalMax||[sint32]
      NormalMin||[sint32]
      PNPDeviceID||[string]
      PowerManagementCapabilities||[uint16]
      PowerManagementSupported||[boolean]
      Resolution|1000|[uint32]
      Status|Unknown|[string]
      StatusInfo||[uint16]
      SystemCreationClassName|Win32_ComputerSystem|[string]
      SystemName|DESKTOP-25LFPVU|[string]
      Tolerance|32768|[sint32]
      UpperThresholdCritical||[sint32]
      UpperThresholdFatal||[sint32]
      UpperThresholdNonCritical||[sint32]QUERY RESULT|# 3|/
      Accuracy|32768|[sint32]
      Availability||[uint16]
      Caption|Sensore numerico|[string]
      ConfigManagerErrorCode||[uint32]
      ConfigManagerUserConfig||[boolean]
      CreationClassName|Win32_TemperatureProbe|[string]
      CurrentReading||[sint32]
      Description|Video Card Thermal Probe|[string]
      DeviceID|root\cimv2 3|[string]
      ErrorCleared||[boolean]
      ErrorDescription||[string]
      InstallDate||[datetime]
      IsLinear||[boolean]
      LastErrorCode||[uint32]
      LowerThresholdCritical||[sint32]
      LowerThresholdFatal||[sint32]
      LowerThresholdNonCritical||[sint32]
      MaxReadable|1270|[sint32]
      MinReadable|64266|[sint32]
      Name|Sensore numerico|[string]
      NominalReading||[sint32]
      NormalMax||[sint32]
      NormalMin||[sint32]
      PNPDeviceID||[string]
      PowerManagementCapabilities||[uint16]
      PowerManagementSupported||[boolean]
      Resolution|1000|[uint32]
      Status|Unknown|[string]
      StatusInfo||[uint16]
      SystemCreationClassName|Win32_ComputerSystem|[string]
      SystemName|DESKTOP-25LFPVU|[string]
      Tolerance|32768|[sint32]
      UpperThresholdCritical||[sint32]
      UpperThresholdFatal||[sint32]
      UpperThresholdNonCritical||[sint32]
       
      Could please anyone help me out? 
      Thanks in advance
      Francesco
    • czardas
      By czardas
      Haven't had much time to code recently. However the following thread inspired me.
      The debate about linear, parallel and binary search methods was rather interesting and, in an attempt to be diplomatic, I decided to combine @jchd's suggestion with @LarsJ's binary search example. I decided that the binary search algorithm required modification to make it more linear. As usual, 'if you invent something, it probably already exists and if it already exists, it exists for a reason'. My first attempt was not all that good. The code worked but was really a mess. I blame peer pressure (to post an example of a parallel search method).  I will delete that old code in due course.
      With a little memory jogging and a glance at the help file, the solution turned out to be quite easy: I just needed a better understanding of Euler. Further modification will be needed to work with more complicated unicode strings. The output could be returned as an array or a delimitered string. I'm not so interested in those details. I'm just going to post the algorithm for now and anyone, who wants to, can modify it to suit their needs. Both arrays must contain at least 1 element.
      Local $aFoo = [0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,19,20,23,24,26,30,35,39,40,41] Local $aBar = [0,1,5,6,7,8,9,10,11,12,13,14,17,18,19,21,24,25,26,27,34,35,38,40] ParallelExponetialSearch($aFoo, $aBar) ; Compares two lists - returning positive matches. Each input array must be unique (individually) and in alphabetical order. Func ParallelExponetialSearch($aFoo, $aBar) Local $sFind, _ $iMin_F = -1, $iMax_F = UBound($aFoo) -1, $Lo_F = $iMin_F, $Hi_F, _ $iMin_B = -1, $iMax_B = UBound($aBar) -1, $Lo_B = $iMin_B, $Hi_B While $iMin_F < $iMax_F And $iMin_B < $iMax_B ; Toggle Arrays - Which array has most untested elements? This is the one we want to search next, ; so we can bypass more comparisons because (in theory) mismatches have a greater chance of being skipped. If $iMax_F - $iMin_F >= $iMax_B - $iMin_B Then ; $aFoo has more (or an equal number of) untested elements $Hi_F = $iMax_F $iMin_B += 1 $sFind = $aBar[$iMin_B] While $Lo_F < $Hi_F ; search $aFoo For $i = 0 To Floor(Log($Hi_F - $Lo_F) / Log(2)) $Lo_F = $iMin_F + 2^$i If $aFoo[$Lo_F] = $sFind Then $iMin_F = $Lo_F ; each match should be added to the output [perhaps an array] ConsoleWrite($sFind & " found at $aFoo[" & $Lo_F & "] = $aBar[" & $iMin_B & "]" & @LF) ExitLoop 2 ElseIf $aFoo[$Lo_F] > $sFind Then $Hi_F = $Lo_F -1 $iMin_F += Floor(2^($i -1)) $Lo_F = $iMin_F ContinueLoop 2 EndIf Next $iMin_F = $Lo_F ; minimum increment is one WEnd Else ; $aBar has more untested elements $Hi_B = $iMax_B $iMin_F += 1 $sFind = $aFoo[$iMin_F] While $Lo_B < $Hi_B ; search $aBar For $i = 0 To Floor(Log($Hi_B - $Lo_B) / Log(2)) $Lo_B = $iMin_B + 2^$i If $aBar[$Lo_B] = $sFind Then $iMin_B = $Lo_B ; each match should be added to the output [perhaps an array] ConsoleWrite($sFind & " found at $aFoo[" & $iMin_F & "] = $aBar[" & $Lo_B & "]" & @LF) ExitLoop 2 ElseIf $aBar[$Lo_B] > $sFind Then $Hi_B = $Lo_B -1 $iMin_B += Floor(2^($i -1)) $Lo_B = $iMin_B ContinueLoop 2 EndIf Next $iMin_B = $Lo_B ; minimum increment is one WEnd EndIf WEnd EndFunc ;==> ParallelExponetialSearch I hope this will be useful to someone. I believe it deserved a thread of its own!
    • RC86
      By RC86
      Afternoon!
      I have a requirement to return both a string and an array from a function so as a result I put them both into an array and returned that.  I can access them in their entirety after returning them but then I can't seem to access the array elements after this.  Should I be able to or is there a prettier way?
      #include <Array.au3> ;Memory info returned as a string and an array $memoryInfo = _getMemoryInfo() msgbox(0,"Memory Info",$memoryInfo[0]) _ArrayDisplay($memoryInfo[1],"Memory as an Array") Local $newArray[7] $memoryInfo[1] = $newArray msgbox(0,"Test element",$newArray[0]) _ArrayDisplay($newArray) Func _getMemoryInfo() Local $newArray[7] Local $array = MemGetStats() $newArray[0] = $array[0] ;% of memory in use $newArray[1] = Round($array[1]/1024 * 0.001,2) ;Total physical RAM $newArray[2] = Round($array[2]/1024 * 0.001,2) ;Availaible physical RAM $newArray[3] = Round($array[3]/1024 * 0.001,2) ;Total pagefile $newArray[4] = Round($array[4]/1024 * 0.001,2) ;Available pagefile $newArray[5] = Round($array[5]/1024 * 0.001,2) ;Total virtual $newArray[6] = Round($array[6]/1024 * 0.001,2) ;Available virtual $memoryUsage = $newArray[1] - $newarray[2] $pagefileUsage = $newArray[3] - $newarray[4] ;Output/Return Local $returnArray[2] $returnArray[0] = "Memory: " & $memoryUsage & " GB/" & $newArray[1] & " GB " & @CRLF & "Pagefile: " & $pagefileUsage & " GB/" & $newArray[3] & " GB " $returnArray[1] = $newArray return $returnArray EndFunc A bit messy but hopefully it's understandable what I'm trying to achieve.
      Thanks!
    • Jibberish
      By Jibberish
      I am having difficulties getting updated results from GUICtrlCreateInput. I wrote a small script to demonstrate what I am trying to do.
      This script reads a text file into an array and displays the Name and Number from the text file.
      The user can check a name and change the number, and the results are displayed in _ArrayDisplay.
      Only the Checked names are displayed in their original position. This is necessary for future
      plumbing.
      The problem with this script is the original number is returned, not the changed number. I cannot
      figure out how to get the updated number to be displayed.
      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; This script reads a text file into an array and displays the Name and Number from the text file. ; The user can check a name and change the number, and the results are displayed in _ArrayDisplay. ; Only the Checked names are displayed in their original position. This is necessary for future ; plumbing. ; ; The problem with this script is the original number is returned, not the changed number. I cannot ; figure out how to get the updated number to be displayed. ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include-once #include <MsgBoxConstants.au3> #include <array.au3> #include <Date.au3> #include <WinAPIFiles.au3> #include <AutoItConstants.au3> #include <Misc.au3> #include <File.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> Local $iMax = 6 ;Default number of Videos - 1 for the array counter Dim $aTextFile[$iMax][2] ; [start with 5 entries][Name, Number] Don't get confused! [Row][Column] Local $i = 0 Local $iLeft = 30 Local $iTop = 30 Local $sName Local $sNumber Local $aArray Local $iMaxCol = 5 Local $iRow = 0 Local $iCol = 0 Local $aNumberCount[$iMaxCol][2] $aArray1 = ReadFile() $aNamesNumbers = DisplayNames($aArray1) _ArrayDisplay($aNamesNumbers) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; ReadFile() places the contents of the NameNumber.txt file in an array ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Func ReadFile() Local $sFileData = @ScriptDir & "\NameNumber.txt" Local $iStrReturn = 0 Local $aArrayFile Local $aTextFile[$iMaxCol][2] Local $aName Local $sCheckBox1 Const $iL = 10 ; Count from Left for GUI so all buttons line up Local $sFill Local $iA = 0, $iN = 0 ; Put the Names into an Array _FileReadToArray($sFileData, $aArrayFile) For $iA = 0 To $aArrayFile[0] ; Step through the array looking for Names If StringInStr($aArrayFile[$iA], "Name:") Then $aName = StringSplit($aArrayFile[$iA],":") $sFill = $aName[2] If UBound($aTextFile) <= $iRow Then ; Resize the array when $iRow is equal to the element count in the array to prevent subscript error ReDim $aTextFile[UBound($aTextFile) + 1][$iMaxCol] EndIf $aTextFile[$iRow][$iCol] = $sFill $iRow += 1 EndIf Next $iCol = 1 $iRow = 0 $sFill = "" For $iA = 1 To $aArrayFile[0] ; Step through the array looking for Numbers If StringInStr($aArrayFile[$iA], "Number:") Then $aName = StringSplit($aArrayFile[$iA],":") $sFill = $aName[2] If UBound($aTextFile) <= $iRow Then ; Resize the array when $iRow is equal to the element count in the array to prevent subscript error ReDim $aTextFile[UBound($aTextFile) + 1][$iMaxCol] EndIf $aTextFile[$iRow][$iCol] = $sFill $iRow += 1 EndIf Next Return $aTextFile EndFunc ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Display the Name and Number ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Func DisplayNames($aArray1) Local $aName[$iMax] Local $aNumbers[$iMax] $iMMCount = UBound($aArray1) $iMMCount -=1 Local $iWidth = 300 Local $iLength = 300;$iMMCount * 30 GUISetFont(12) $hGUI = GUICreate("Edit / Update Number Test", $iWidth, $iLength, -1, -1) GUICtrlCreateLabel(" Name Number",1,5) ;$iTop += 30 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Display Name with a Checkbox. Only Checked Names should be saved. ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For $i = 0 to $iMMCount Step 1 $sNameText = $aArray1[$i][0] $iNameLength = StringLen($sNameText) $aName[$i] = GUICtrlCreateCheckbox($sNameText,$iLeft, $iTop) $iTop += 30 Next ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Display the number from the text file below each name. Allow the user to change the number and display the ; new number. ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $iLeft = 60 GUIStartGroup() $iTop = 28 For $i = 0 to $iMMCount Step 1 $sNumberText = $aArray1[$i][1] $aNumberCount[$i][1] = $sNumberText $aNumberCount[$i][0] = GUICtrlCreateInput($sNumberText,$iLeft, $iTop, 50,18, $GUI_DOCKAUTO) GUICtrlSetPos($aNumberCount[$i][0],200) $iTop += 30 Next ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Read the checked names and (possibly updated) number ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $iMMCount = UBound($aNumberCount) $iMMNewCount = $iMMCount - 1 Local $aGUICheckbox[$iMMCount] Local $aCheckedNameNumber[$iMMCount][2] $iLeft = 30 Local $idCloseGUI = GUICtrlCreateButton("Close",$iLeft, $iTop) GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $idCloseGUI For $i = 0 To $iMMNewCount Step 1 Switch GUICtrlRead($aName[$i]) Case $GUI_CHECKED $aCheckedNameNumber[$i][0] = $aArray1[$i][0] Case $GUI_UNCHECKED EndSwitch Switch GUICtrlRead($aNumberCount[$i][0]) Case $aCheckedNameNumber[$i][1] = GUICtrlRead($aNumberCount[$i][1]) EndSwitch Next ExitLoop EndSwitch WEnd For $i = 0 to $iMMNewCount step 1 GUICtrlRead($aNumberCount[$i][0]) If $aCheckedNameNumber[$i][0] <> "" Then $aCheckedNameNumber[$i][1] = $aNumberCount[$i][1] EndIf Next GUIDelete($hGUI) Return $aCheckedNameNumber EndFunc This is the text file I am reading. If you want to try this out put the NameNumber.txt file in your script directory. It's attached to the post.
      * This is a dummy file with a Name and Number * The only purpose of this file is to read the updated Number. Name:Taggart Number:916 Name:Mongo Number:90 Name:Hedley Lamarr Number:22 Name:Bart Number:9999 Name:The Waco Kid Number:2244 If I change the number, the original number is displayed at the end, not the updated/modified number. I need the modified number to be displayed.
      Thanks in advance for any assistance!
      Jibberish
      NameNumber.txt
    • Jibberish
      By Jibberish
      I am working on a Video Player Test Script. I am reading a text file into a 3d array to be displayed in a GUI.
      Array Content:
      [x][0]FileName.mp4
      [x][1]UsageCount -> Up to a 4 digit number
      [x][2]EnableUsageCount (True/False)
      In the GUI the user can check the filename box, edit the number of usages and check EnableUsageCount to turn on the UsageCount control using the UsageCount number for the maximum number of plays.
      To make this easier to deal with I have removed the EnableUsageCount section, and am just concentrating on getting a method to put the edited (or unchanged) UsageCount in the array. Currently nothing is read into the array, due to my using the wrong method in the Case statement.
      Here are code snippets of what I am trying to do:
      ; Snippets from script ; I read the text file at the bottom and put the .mp4 filenames in $aManifest[x][0] and UsageCount in $aManifest[x][1] ; Then I create a GUI to display the .mp4 filenames with checkboxes and the UsageCount to the right. UsageCount is editable by the user. ; If the filename is checked, I want to read the filename into $aCheckedVideos[x][0] and the updated UsageCount in $aCheckedVideos[x][1] ; The GUICtrlRead($aVideoName[$i]) with Case $GUI_CHECKED & UNCHECKED works for the checkboxes ; This section puts the filenames in the GUI with a checkbox For $i = 0 to $iMMCount Step 1 $sMP4Text = $aManifest[$i][0] $iMP4Length = StringLen($sMP4Text) $aVideoName[$i] = GUICtrlCreateCheckbox($sMP4Text,$iLeft, $iTop) $iTop += 30 Next ; This section reads numbers from the Manifest array, and I want to be able to change the number and have them saved. ; So the Case $GUI_CHECKED & UNCHECKED won't work here, and I can't figure out what I should be doing here. For $i = 0 to $iMMCount Step 1 $sUsageText = $aManifest[$i][1] $aUsageCount[$i] = GUICtrlCreateInput($sUsageText,$iLeft, $iTop, 50,18, $GUI_DOCKAUTO) GUICtrlSetPos($aUsageCount[$i],200) $iTop += 30 Next While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $idCloseGUI For $i = 0 To $iMMNewCount Step 1 Switch GUICtrlRead($aVideoName[$i]) Case $GUI_CHECKED $aCheckedVideos[$i][0] = $aManifest[$i][0] ; If checked, I put the results into a two D array Case $GUI_UNCHECKED ; where Video Name is $aCheckedVideos[x][0] EndSwitch Switch GUICtrlRead($aUsageCounter[$i]) Case $GUI_CHECKED $aCheckedVideos[$i][1] = $aUsageCount[$i] ;I want to put the text (numbers) in $aCheckedVideos[x][1] Case $GUI_UNCHECKED ;but what is returned is blank, probably due to EndSwitch ; $GUI_CHECKED being the wrong thing. Next ExitLoop EndSwitch WEnd ;The txt file I'm reading has the following: ;~ /** Title #1: Big Buck Bunny 1080p **/ ;~ "Name": "Big Buck Bunny", ;~ "URI": "..\\MediaFiles\\bbb_1080_60s.mp4", ;~ "UsageCount": 9999, ;~ "URI": "..\\MediaFiles\\bbb_1080_60s_enc1.mp4", ;~ "UsageCount": 45, ;~ "URI": "..\\MediaFiles\\bbb_1080_60s_enc1.mp4", ;~ "UsageCount": 2, ;~ /** Title #2: Tears of Steel 4K **/ ;~ "Name": "Tears of Steel 4K", ;~ "URI": "..\\MediaFiles\\tos_4K_60s_HEVC.mp4", ;~ "UsageCount": 9876, ;~ "URI": "..\\MediaFiles\\tos_4K_60s_HEVC_enc2.mp4", ;~ "UsageCount": 0, ;~ "URI": "..\\MediaFiles\\tos_4K_60s_HEVC_enc2.mp4", ;~ "UsageCount": 5, I am certain that the section
                          Switch GUICtrlRead($aUsageCounter[$i])
                              Case $GUI_CHECKED
                                  $aCheckedVideos[$i][1] = $aUsageCount[$i]    ;I want to put the text (numbers) in $aCheckedVideos[x][1]
                              Case $GUI_UNCHECKED                                ;but what is returned is blank, probably due to
                          EndSwitch                                            ; $GUI_CHECKED being the wrong thing.

      is wrong, and this is what I am looking for help with. Instead of $GUI_CHECKED what should I be looking for?
      The worst part of this is I had this working late last night, and then lost my changes and cannot for the life of me remember how I had this working.
      Help is truly appreciated!
      Jibberish