Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

VBScript - Array gezielt abfragen

Frage Entwicklung VB for Applications

Mitglied: appleseed

appleseed (Level 1) - Jetzt verbinden

06.12.2007, aktualisiert 08.12.2007, 5690 Aufrufe, 3 Kommentare

Hallo,

mit folgendem Script ist es mir möglich, die Registrierung nach installierter Software auf einem PC abzufragen:


01.
Const HKCR = &H80000000 
02.
Const HKCU = &H80000001 
03.
Const HKLM = &H80000002 
04.
 
05.
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & ".\root\default:StdRegProv") 
06.
 
07.
sUninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 
08.
 
09.
oReg.EnumKey HKLM, sUninstallPath, aSubkeys 
10.
 
11.
On Error Resume Next 
12.
For Each sSubkey In aSubkeys 
13.
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", 
14.
sAppName 
15.
WScript.Echo sAppName 
16.
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:

01.
strComputer = "." 
02.
 
03.
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
04.
Set colItems = objWMIService.ExecQuery ("Select * from Win32_Product WHERE Name = 'Name der Software'") 
05.
Set objWshShell = WScript.CreateObject("WScript.Shell") 
06.
 
07.
strInstall = "Installationsbefehl" 
08.
 
09.
If colItems.Count <1 Then 
10.
	objWshShell.Run strInstall, 0, True 
11.
End If
Vielen Dank für Eure Hilfe.
Torsten
Mitglied: bastla
06.12.2007 um 16:09 Uhr
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:
01.
Const SW = "Opera" 
02.
Const HKCR = &H80000000 
03.
Const HKCU = &H80000001 
04.
Const HKLM = &H80000002 
05.
 
06.
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & ".\root\default:StdRegProv") 
07.
 
08.
sUninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 
09.
 
10.
oReg.EnumKey HKLM, sUninstallPath, aSubkeys 
11.
 
12.
iSWLen = Len(SW) 
13.
sSW = LCase(SW) 
14.
 
15.
On Error Resume Next 
16.
For Each sSubkey In aSubkeys 
17.
	oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName",sAppName 
18.
	If Left(LCase(sAppName), iSWLen) = sSW Then WScript.Echo sAppName 
19.
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
Bitte warten ..
Mitglied: appleseed
08.12.2007 um 08:59 Uhr
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:

01.
For Each sSubkey In aSubkeys 
02.
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", sAppName 
03.
	Select Case sAppName 
04.
		Case "Name der Software" 
05.
		counter = counter + 1 
06.
	End Select 
07.
Next 
08.
 
09.
If counter < 1 Then 
10.
	'Aktion: "Software muss noch installiert werden" 
11.
	Else 
12.
	'Aktion: "Software ist bereits installiert" 
13.
End If
Gruß

Torsten
Bitte warten ..
Mitglied: bastla
08.12.2007 um 10:29 Uhr
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:
01.
bFound = False 
02.
For Each sSubkey In aSubkeys 
03.
oReg.GetStringValue HKLM, sUninstallPath & "\" & sSubkey, "DisplayName", sAppName 
04.
	If sAppName = "Name der Software" Then 
05.
		bFound = True 
06.
		Exit For 
07.
	End If 
08.
Next 
09.
 
10.
If Not bFound Then 
11.
	'Aktion: "Software muss noch installiert werden" 
12.
	Else 
13.
	'Aktion: "Software ist bereits installiert" 
14.
End If
Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
gelöst Php regex und Array (5)

Frage von Thomas91 zum Thema PHP ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

Entwicklung
gelöst Get ip from external txt file and use in vbscript (5)

Frage von thankusomuch zum Thema Entwicklung ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...