appleseed
Goto Top

VBScript - Array gezielt abfragen

Hallo,

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

Content-Key: 75367

Url: https://administrator.de/contentid/75367

Printed on: April 23, 2024 at 12:04 o'clock

Member: bastla
bastla Dec 06, 2007 at 15:09:27 (UTC)
Goto Top
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:
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
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
Member: appleseed
appleseed Dec 08, 2007 at 07:59:47 (UTC)
Goto Top
Hallo bastla,

vielen Dank für Deine Hilfe, aber es ist nicht ganz das, was ich suche. Den exakten Namen der Software kenne ich ja bereits. Das Problem ist nur, ich muss die Installation der Software zur Ausführung bringen, wenn sie in dem Array nicht vorhanden ist. Und hier liegt das Problem - bei einigen hundert Installationen würde die Installationsanweisung jedes mal aufgerufen, wenn die If-Anweisung den Namen nicht findet.

Ich hab's jetzt so gelöst:

For Each sSubkey In aSubkeys
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", sAppName  
	Select Case sAppName
		Case "Name der Software"  
		counter = counter + 1
	End Select
Next

If counter < 1 Then
	'Aktion: "Software muss noch installiert werden"  
	Else
	'Aktion: "Software ist bereits installiert"  
End If

Gruß

Torsten
Member: bastla
bastla Dec 08, 2007 at 09:29:28 (UTC)
Goto Top
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:
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