VBScript - Array gezielt abfragen
Hallo,
mit folgendem Script ist es mir möglich, die Registrierung nach installierter Software auf einem PC abzufragen:
Ich möchte nun dieses Array auf Vorhandensein einer bestimmten Software abfragen um im Anschluß die Software ggf. zu installieren. In der WMI Klasse "WIN32_Product" wird die Software leider nicht gelistet - hier wäre bei Vorhandensein die Abfrage einfacher:
Vielen Dank für Eure Hilfe.
Torsten
mit folgendem Script ist es mir möglich, die Registrierung nach installierter Software auf einem PC abzufragen:
Const HKCR = &H80000000
Const HKCU = &H80000001
Const HKLM = &H80000002
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & ".\root\default:StdRegProv")
sUninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKLM, sUninstallPath, aSubkeys
On Error Resume Next
For Each sSubkey In aSubkeys
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName",
sAppName
WScript.Echo sAppName
Next
Ich möchte nun dieses Array auf Vorhandensein einer bestimmten Software abfragen um im Anschluß die Software ggf. zu installieren. In der WMI Klasse "WIN32_Product" wird die Software leider nicht gelistet - hier wäre bei Vorhandensein die Abfrage einfacher:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery ("Select * from Win32_Product WHERE Name = 'Name der Software'")
Set objWshShell = WScript.CreateObject("WScript.Shell")
strInstall = "Installationsbefehl"
If colItems.Count <1 Then
objWshShell.Run strInstall, 0, True
End If
Vielen Dank für Eure Hilfe.
Torsten
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 75367
Url: https://administrator.de/contentid/75367
Ausgedruckt am: 15.11.2024 um 23:11 Uhr
3 Kommentare
Neuester Kommentar
Hallo appleseed!
Soferne ich Dich richtig verstehe, willst Du den ausgelesenen "sAppName" auf den Namen einer bestimmten Software hin untersuchen. Am Beispiel von "Opera" könnte das so aussehen:
Verglichen wird jeweils nur der Anfang des gelesenen SW-Namens, wobei durch die Verwendung von LCase() die Unterscheidung Groß- / Kleinschreibung aufgehoben wird. Damit die Umwandlung und Längenbestimmung für den Suchbegriff nicht bei jedem Schleifendurchlauf erfolgt, werden die entsprechenden Werte bereits vor der Schleife ermittelt.
Grüße
bastla
Soferne ich Dich richtig verstehe, willst Du den ausgelesenen "sAppName" auf den Namen einer bestimmten Software hin untersuchen. Am Beispiel von "Opera" könnte das so aussehen:
Const SW = "Opera"
Const HKCR = &H80000000
Const HKCU = &H80000001
Const HKLM = &H80000002
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & ".\root\default:StdRegProv")
sUninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKLM, sUninstallPath, aSubkeys
iSWLen = Len(SW)
sSW = LCase(SW)
On Error Resume Next
For Each sSubkey In aSubkeys
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName",sAppName
If Left(LCase(sAppName), iSWLen) = sSW Then WScript.Echo sAppName
Next
Grüße
bastla
Hallo appleseed!
Sorry - für mich hatte es eher danach geklungen, als ob das Vergleichen das Problem wäre ...
Noch zwei Anmerkungen:
Eine eher "kosmetische" Sache: Was Du eigentlich brauchst, ist ein Schalter (flag), aus dessen Zustand nach der Schleife ersichtlich ist, ob die Software gefunden wurde. Dein Zähler tut's natürlich auch, aber da die Anzahl eigentlich ohnehin nur 0 oder 1 ergeben sollte, kannst Du den Rechenschritt einsparen.
Zum Thema "Einsparen" allerdings ein weiterer Vorschlag: Sobald das gesuchte Programm gefunden wurde, ist es nicht mehr nötig, die weiteren ausgelesenen Programmnamen zu vergleichen.
Das Ganze sähe dann etwa so aus:
Grüße
bastla
Sorry - für mich hatte es eher danach geklungen, als ob das Vergleichen das Problem wäre ...
Noch zwei Anmerkungen:
Eine eher "kosmetische" Sache: Was Du eigentlich brauchst, ist ein Schalter (flag), aus dessen Zustand nach der Schleife ersichtlich ist, ob die Software gefunden wurde. Dein Zähler tut's natürlich auch, aber da die Anzahl eigentlich ohnehin nur 0 oder 1 ergeben sollte, kannst Du den Rechenschritt einsparen.
Zum Thema "Einsparen" allerdings ein weiterer Vorschlag: Sobald das gesuchte Programm gefunden wurde, ist es nicht mehr nötig, die weiteren ausgelesenen Programmnamen zu vergleichen.
Das Ganze sähe dann etwa so aus:
bFound = False
For Each sSubkey In aSubkeys
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", sAppName
If sAppName = "Name der Software" Then
bFound = True
Exit For
End If
Next
If Not bFound Then
'Aktion: "Software muss noch installiert werden"
Else
'Aktion: "Software ist bereits installiert"
End If
Grüße
bastla