- Offizieller Beitrag
Hi,
ich wollte mal eben die Programmversionen aller installierten Programme ermitteln und habe festgestellt, dass sich da kein Softwarehersteller an feste Regeln hält.
Bei einem Großteil wird die Versionsnummer im Schlüssel "HKLM\ Software\ Microsoft\ Windows\ CurrentVersion\ Uninstall\ SOFTWARENAME\ DisplayVersion" hinterlegt. Das ist prima.
Bei den anderen (Autoit gehört auch dazu ) ist teilweise die Versionsnummer im Namen enthalten oder in einem anderen Registryschlüssel, der von Programm zu Programm variiert, hinterlegt.
Es gibt aber auch Spezialisten, die die Versionsnr. gar nicht in der Registry hinterlegen - da hilft dann nur Pfad suchen und mit FileGetVersion( ) nachsehen.
Hat evtl. jemand eine zündende Idee, wie man da eine automatisierte Abfrage hinbekommt?
Hier könnt ihr mal selber schauen, wieviel Progs sich sauber eintragen und wieviele nicht (unbenommen derer, die gar nicht im Uninstall-Schlüssel stehen):
Spoiler anzeigen
#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <array.au3>
Dim $RegKey = "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\"
Dim $Wert, $Fehler=0, $i=0, $str
Dim $ar_SubKeys[1], $ar_Progs[1], $ar_Progs_oVer[1]
$ar_SubKeys[0] = 0
$ar_Progs[0] = 0
$ar_Progs_oVer[0] = 0
; == GUI generated with Koda ==
$Form1 = GUICreate("AForm1", 622, 670, -1, -1)
$List1 = GUICtrlCreateListView("Programm|Version", 24, 30, 577, 300, $LVSCW_AUTOSIZE)
_GUICtrlListViewSetColumnWidth(-1, 0, 320)
_GUICtrlListViewSetColumnWidth(-1, 1, 230)
$List2 = GUICtrlCreateList("", 24, 360, 577, 300)
GUICtrlCreateLabel("Programme mit Reg-Key 'DisplayVersion'", 200, 10)
GUICtrlCreateLabel("Programme ohne Reg-Key 'DisplayVersion'", 200, 340)
GUISetState(@SW_SHOW)
_ReadInstalledProg()
[/autoit] [autoit][/autoit] [autoit]; Progs mit Key "DisplayVersion"
For $i = 1 To $ar_Progs[0]
$var = StringSplit($ar_Progs[$i], "\")
_GUICtrlListViewInsertItem($List1, -1, $var[1] & "|" & $var[2])
Next
; Progs ohne Key "DisplayVersion"
For $i = 1 To $ar_Progs_oVer[0]
GUICtrlSetData($List2, $ar_Progs_oVer[$i])
Next
While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case Else
;;;;;;;
EndSelect
WEnd
Exit
Func _ReadInstalledProg()
Do
$i+=1
$Wert=RegEnumKey($RegKey, $i)
$Fehler=@Error
If $Fehler=0 Then
_ArrayAdd($ar_SubKeys, $Wert)
$ar_SubKeys[0] += 1
EndIf
Until $Fehler<>0
For $i = 1 To $ar_SubKeys[0]
$valName = RegRead($RegKey & $ar_SubKeys[$i], "DisplayName")
$valVer = RegRead($RegKey & $ar_SubKeys[$i], "DisplayVersion")
If $valName <> "" Then
Select
Case $valVer = ""
$str = $valName
_ArrayAdd($ar_Progs_oVer, $str)
$ar_Progs_oVer[0] += 1
Case Else
$str = $valName & "\" & $valVer
_ArrayAdd($ar_Progs, $str)
$ar_Progs[0] += 1
EndSelect
EndIf
Next
EndFunc