gdnmarc
Goto Top

VBS - Reg-Werte in Array einlesen und später wieder auslesen?

Hallo zusammen,

ich möchte eine unbekannte Anzahl von DWORD Reg-Einträgen in einem vorgebenen Schlüssel in ein Array einlesen.

Später möchte ich dann über ein anderes Script welches ich in dem o.a Script aufrufe entspreche benötigte Werte auslesen, bzw. weiterverwenden.

1.) wie kann ich ein solches Array erstellen, um wertnamen und wertinhalt in ein array einzulesen
2.) wie kann ich wertinhalte bestimmter wertnamen über ein anderes script wieder auslesen, bzw. weiterverweden (wscript.echo)

Also...Wert x mit Inhalt 1 und Wert y mit Inhalt 2 aus Schlüssel abc in ein Array einlesen und in einem eingebundenen Script dann Inhalte der Werte x und y auslesen.

Ich hoffe mich versteht jemand und kann mir ein wenig weiterhelfen!!!!!!

1000Dank!

Viele Grüße!Q!

Content-ID: 97819

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

Ausgedruckt am: 19.11.2024 um 09:11 Uhr

bastla
bastla 25.09.2008 um 18:42:17 Uhr
Goto Top
Hallo gdnmarc!

So ganz verstehe ich Dein Vorhaben nicht; vor allem: wann soll das zweite Script gestartet werden, und warum liest dieses nicht einfach selbst die Werte ein?

Anyhow - das Einlesen könnte so aussehen (wobei hier verschiedene Möglichkeiten - mehrdimensionales Array, zwei eindimensionale Arrays, Dictionary - für das Ergebnis in Frage kämen):
Const HKLM = &H80000002
Const DWORD = 4
strComputer = "."  

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _  
    strComputer & "\root\default:StdRegProv")  
 
sKey = "Software\Microsoft\Windows NT\CurrentVersion\FontMapper"  
objReg.EnumValues HKLM, sKey, aNames, aTypes

'nur ein Gesamtarray  
Dim aEntries
ReDim aEntries(UBound(aNames), 1)
'eigenes Array für Werte  
Dim aValues
ReDim aValues(UBound(aNames))
'Dictionary  
Set d = CreateObject("Scripting.Dictionary")  

For i = 0 To UBound(aNames)
    If aTypes(i) = DWORD Then
        objReg.GetDWORDValue HKLM, sKey, aNames(i), Value
        'nur ein Gesamtarray  
        aEntries(i, 0) = aNames(i)
        aEntries(i, 1) = Value
        'eigenes Array für Werte  
        aValues(i) = Value
        'Dictionary  
        d.Add aNames(i), Value
    End If
Next

'nur ein Gesamtarray  
For i = 0 To UBound(aEntries)
    WScript.Echo aEntries(i, 0) & ": " & aEntries(i, 1)  
Next
WScript.Echo "-----------------------"  
'eigenes Array für Werte  
For i = 0 To UBound(aNames)
    WScript.Echo aNames(i) & ": " & aValues(i)  
Next
WScript.Echo "-----------------------"  
'Dictionary  
For Each Key In d.Keys
    WScript.Echo Key & ": " & d.Item(Key)  
Next
Grüße
bastla

P.S.: Da Du den entsprechenden Key nicht genannt hast, musste ich mir selbst ein Beispiel suchen ...
gdnmarc
gdnmarc 25.09.2008, aktualisiert am 18.10.2012 um 18:36:18 Uhr
Goto Top
Hallo bastla!!!

Ein riesen Danke an Dich....sagmal...ich habe drei Anfragen gestellt und jedes Mal von Dir ein fertiges Script welches auf Anhieb funktioniert zurückbekommen!! Ich bin Dir sehr dankbar!!!!!!!!!!!!!!!!!! Du hattest mir auch mal ein Script erstellt, welches in Registry mir den höchsten Schlüssel aus der Registry ausliest: VBScript zum Auslesen eines bestimmten Registry Schlüssels In diesem Schlüssel finde ich Werte die ich zur Zeit fest auslese....also gebe mir Inhalt von Key 1 usw. aus und mappe zum Beispiel dann ein Laufwerk oder ähnliches mit den Werten. Das 1. Script soll als Basis dienen und mit diesem Script alle Werte in ein Array lesen. Danach soll in diesem Script einfach ein weiteres Script aufgerufen werden, um diese Daten zu verarbeiten (copy, reg, suchen und ersetzen, was gerade anliegt) Diese Scripte soll jeder selber erstelle und einfach in das Hauptscript einbinden. In den individuellen Scripten muss der Inhalt des Arrays aber vorhanden sein, damit die Werte auch weiterverarbeitet werden können. Geht das?

Danke, danke, danke!!

LG, Marc
bastla
bastla 25.09.2008 um 19:14:47 Uhr
Goto Top
Hallo gdnmarc!

Ohne mich jetzt wirklich hineingedacht zu haben: Am einfachsten wäre es aus meiner Sicht, alles in ein Script zu packen, wobei das Auslesescript zum Erstellen des Arrays/Dictionary als Hauptprogramm zuerst ausgeführt werden müsste, und alle weiteren Scripts danach einfach als "Sub" aufgerufen werden könnten, wobei (da Variablen in VBScript ohnehin immer global sind) diese Scripts dann automatisch Zugriff auf das Array oder Dictionary hätten.

Grüße
bastla
gdnmarc
gdnmarc 25.09.2008 um 19:17:36 Uhr
Goto Top
Hi Bastla,

wie kann ich mir das den vorstellen, das diese als Sub aufgerufen werden können?

Thx!!!

Gruß, Marc
bastla
bastla 25.09.2008 um 19:41:51 Uhr
Goto Top
Hallo gdnmarc!

Im Prinzip so, wie ich das oben schon integriert hatte, wobei ich gleich ohne Verwendung von "Subs" die Ausgabevarianten habe laufen lassen - mit Aufteilung in einzelne "Subs" könnte das so aussehen:
Const HKLM = &H80000002
Const DWORD = 4
strComputer = "."  

Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _  
    strComputer & "\root\default:StdRegProv")  
 
sKey = "Software\Microsoft\Windows NT\CurrentVersion\FontMapper"  
objReg.EnumValues HKLM, sKey, aNames, aTypes

'nur ein Gesamtarray  
Dim aEntries
ReDim aEntries(UBound(aNames), 1)
'eigenes Array für Werte  
Dim aValues
ReDim aValues(UBound(aNames))
'Dictionary  
Set d = CreateObject("Scripting.Dictionary")  

For i = 0 To UBound(aNames)
    If aTypes(i) = DWORD Then
        objReg.GetDWORDValue HKLM, sKey, aNames(i), Value
        'nur ein Gesamtarray  
        aEntries(i, 0) = aNames(i)
        aEntries(i, 1) = Value
        'eigenes Array für Werte  
        aValues(i) = Value
        'Dictionary  
        d.Add aNames(i), Value
    End If
Next

'Aufruf der Unterprogramme  
NurEinArray
WScript.Echo "-----------------------"  
Eigenes
WScript.Echo "-----------------------"  
Dict
'##################  
'Ende Hauptprogramm  
'##################  

'Unterprogramme  
Sub NurEinArray
'nur ein Gesamtarray  
For i = 0 To UBound(aEntries)
    WScript.Echo aEntries(i, 0) & ": " & aEntries(i, 1)  
Next
End Sub

Sub Eigenes
'eigenes Array für Werte  
For i = 0 To UBound(aNames)
    WScript.Echo aNames(i) & ": " & aValues(i)  
Next
End Sub

Sub Dict
'Dictionary  
For Each Key In d.Keys
    WScript.Echo Key & ": " & d.Item(Key)  
Next
End Sub
Noch genauer wäre es, dem jeweiligen "Sub" beim Aufruf das Array als Parameter zu übergeben - das sähe (bis Zeile 31 würde sich dadurch nichts ändern) dann so aus:
'Aufruf der Unterprogramme  
NurEinArray aEntries
WScript.Echo "-----------------------"  
Eigenes aNames, aValues
WScript.Echo "-----------------------"  
Dict d
'##################  
'Ende Hauptprogramm  
'##################  

'Unterprogramme  
Sub NurEinArray(aE)
'nur ein Gesamtarray  
For i = 0 To UBound(aE)
    WScript.Echo aE(i, 0) & ": " & aE(i, 1)  
Next
End Sub

Sub Eigenes(aN, aV)
'eigenes Array für Werte  
For i = 0 To UBound(aN)
    WScript.Echo aN(i) & ": " & aV(i)  
Next
End Sub

Sub Dict(dic)
'Dictionary  
For Each Key In dic.Keys
    WScript.Echo Key & ": " & dic.Item(Key)  
Next
End Sub
Damit blieben die einzelnen Scripts dann tatsächlich "eigenständig" ...

Grüße
bastla
gdnmarc
gdnmarc 26.09.2008 um 11:43:43 Uhr
Goto Top
Hi Bastla,

thx vielen Dank!! Ist so ein Sub das gleiche wie eine Funktion die über ein Script aufgerufen werden kann? Oder wäre eine Funktion nochmals etwas anderes.

Sorry für die blöden Fragen face-sad

Vielen Dank und Gruß,

Marc
bastla
bastla 26.09.2008 um 12:45:15 Uhr
Goto Top
Hallo gdnmarc!

"Sub" und "Function" sind ähnliche Konstrukte, wobei der größte Unterschied eigentlich darin liegt, dass eine "Function" einen Rückgabewert erzeugt (oder zumindest erzeugen sollte) ...

Grüße
bastla