Registry ohne reg.exe bearbeiten
Nach dem Lesen der Beiträge hier habe ich festgestellt, dass die meisten Batch-Programmierer kaum noch ohne das Tool reg.exe auskommen. Da es jedoch möglicherdings Leute ohne dieses Tool gibt, wollte ich eine Alternative anbieten.
Und das tue ich auch hiermit. Da ich selbst mich nicht in die Abhängigkeit einer 16-Bit-Exe, die nicht einmal allen Windows-Nutzern zur Verfügung steht, begeben kann und will, habe ich eine Methode entwickelt, die auf jedem Windows ab 95 ausführbar ist. Also fangen wir an:
Hier mal ein kleines Batch-Bsp.:
Datentypen gibt es unter Die Windows-Registry mit reg-Dateien bearbeiten
Erklärung zum Auslesealgorithmus:
Mit der Option "delims" definiere ich das Tokentrennzeichen um zu "=". Mit "tokens=1*" sage ich dem CLI, dass der Variablen "%i" (explizit definiert) das erste Token zugewiesen werden soll und "%j" (Folgeelement von i) den Rest abbekommt. Jetzt ist der Wert isoliert.
Das sollte gezeigt haben, dass man auch ohne reg.exe in der Registry arbeiten kann. Diese Methode hat weiterhin den Vorteil, dass man auch nach Werten suchen kann, da in einer REG-Datei alle Sub-Schlüssel mitaufgelistet werden. Außerdem bekommt man, was man sucht, nämlich den Wert in einer Variablen gespeichert, keine seltsame Ausgabe auf dem Bildschirm (bei REG_MULTI_SZ verhält sich reg.exe recht seltsam.
Unklarheiten bitte ich, zu posten.
[Edit Biber] Hier noch mal der Link aus dem Sourcecode in klickbar: Tim.Frodermanns Anleitung Die Windows-Registry mit reg-Dateien bearbeiten [/Edit]
Und das tue ich auch hiermit. Da ich selbst mich nicht in die Abhängigkeit einer 16-Bit-Exe, die nicht einmal allen Windows-Nutzern zur Verfügung steht, begeben kann und will, habe ich eine Methode entwickelt, die auf jedem Windows ab 95 ausführbar ist. Also fangen wir an:
Hier mal ein kleines Batch-Bsp.:
Datentypen gibt es unter Die Windows-Registry mit reg-Dateien bearbeiten
@echo off
:: Für den Fall, dass es sie schon gibt
del temp.reg
:: Vorbereiten der Datei
echo REGEDIT4 > temp.reg
echo. >>temp.reg
:: erstmal einlesen (das sehr viel leichtere von beiden)
echo [HKEY_MEIN_HIVEMein Unterschlüssel] >>temp.reg
echo "MeinWertname"="Mein String" >>temp.reg
:: Nachtrag: REG_EXPAND_SZ: Als Typ "hex(2)" angeben,
:: ANSI-Code-Zahl des Zeichens in hexadezimal, ein Komma,
:: zwei Nullen, ein Komma, Beginn von vorn
:: REG_MULTI_SZ: Wie oben, nur als Typ "hex(7)" angeben und "00"
:: als Zeichen (z.B.: 41,00,<b>00</b>,00) bewirkt Zeilenumbruch
:: Danach REG-Datei einlesen und löschen
regedit /s temp.reg
del temp.reg
:: Und nun das Auslesen.
:: Zuerst Exportieren
regedit /e temp.reg "HKEY_MEIN_HIVEMeinUnterschlüssel"
:: Die Zeile mit dem Wert herausholen
for /f "eol=[ skip=2 tokens=1* delims==" %i in ('type temp.reg') do (
if %i=="MeinWertname" set Zielvariable=%j
)
del temp.reg
::Jetzt steht der Wert in "Zielvariable"
Mit der Option "delims" definiere ich das Tokentrennzeichen um zu "=". Mit "tokens=1*" sage ich dem CLI, dass der Variablen "%i" (explizit definiert) das erste Token zugewiesen werden soll und "%j" (Folgeelement von i) den Rest abbekommt. Jetzt ist der Wert isoliert.
Das sollte gezeigt haben, dass man auch ohne reg.exe in der Registry arbeiten kann. Diese Methode hat weiterhin den Vorteil, dass man auch nach Werten suchen kann, da in einer REG-Datei alle Sub-Schlüssel mitaufgelistet werden. Außerdem bekommt man, was man sucht, nämlich den Wert in einer Variablen gespeichert, keine seltsame Ausgabe auf dem Bildschirm (bei REG_MULTI_SZ verhält sich reg.exe recht seltsam.
Unklarheiten bitte ich, zu posten.
[Edit Biber] Hier noch mal der Link aus dem Sourcecode in klickbar: Tim.Frodermanns Anleitung Die Windows-Registry mit reg-Dateien bearbeiten [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 19202
Url: https://administrator.de/contentid/19202
Ausgedruckt am: 25.11.2024 um 03:11 Uhr
9 Kommentare
Neuester Kommentar
Moin, nullplan001,
warst aber ganz nah dran..
Ersetze in Deiner Zeile...
...den Inhalt der Klammer durch ein 'type temp.reg' in einfachen Anführungszeichen.
Um bei dem Beispiel zu bleiben.. wenn ich nun den PerceivedType haben will:
oder, um endlich zum Setzen in Variablen zu kommen:
Ich hatte mal in einem anderen Tutorial hier (Batch Tut III) als Beispiel in einem Batch:
HTH & HANN
Biber
warst aber ganz nah dran..
Ersetze in Deiner Zeile...
for /f "eol=[ tokens=1* delims== " %i in (temp.reg) do @echo %i %j
>for /f "eol=[ tokens=1* delims== " %i in ('type temp.reg') do @echo %i %j
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.txt]
@ "TextPad.txt"
"Content Type"="text/plain"
"PerceivedType" "text"
[HKEY_CLASSES_ROOT\.txt\PersistentHandler]
@ "{5e941d80-bf96-11cd-b579-08002b30bfeb}"
[HKEY_CLASSES_ROOT\.txt\ShellNew]
"NullFile" ""
>for /F "skip=2 delims== tokens=1,2" %i in ('find "Percei" temp.reg') do @echo %i %j
"PerceivedType" "text"
>for /F "skip=2 delims== tokens=2" %i in ('find "Percei" temp.reg') do MyPerceivedType=%i
>set my
MyPerceivedType="text"
..
Set RegFile=%temp%\%random%.reg
START /W REGEDIT /E %Regfile% "HKEY_CURRENT_USER\Control Panel\International"
:: Auswerten der Werte iDate (0,1,2) und sDate (Datumstrennzeichen)
FOR /F "tokens=1* delims==" %%i IN ('Type %RegFile% ^| FIND /I "iDate"') DO SET iDate=%%j
FOR /F "tokens=1* delims==" %%i IN ('Type %RegFile% ^| FIND /I "sDate"') DO SET sDate=%%j
DEL %RegFile%
:: RegWerte weiterbehandeln... Anführungszeichen entfernen
SET iDate=%iDate:"=%
SET sDate=%sDate:"=%
Biber
Moin nullplan und metalworld,
als kleine Ergänzung zu nullplan's Lösung:
- Ein Tippfehler ist reingerutscht: Statt [...do if %i="ProxyOverride"] sollte es sein [...do if %%i="ProxyOverride"]
- und an der gleichen Stelle ist ein
Liebe Grüße und nochmals danke @nullplan001 für dieses schöne Tutorial
Biber
als kleine Ergänzung zu nullplan's Lösung:
- Ein Tippfehler ist reingerutscht: Statt [...do if %i="ProxyOverride"] sollte es sein [...do if %%i="ProxyOverride"]
- und an der gleichen Stelle ist ein
...%%i in ('find "ProxyOverride" %tmpreg%')
.. oder ähnliche Find/FindStr-Konstrukte etwas schneller als...%%i in ('type %tmpreg%')
Liebe Grüße und nochmals danke @nullplan001 für dieses schöne Tutorial
Biber
Hallo,
ich hab mal eine Frage zu diesem Skript:
Sobald bei ProxyOverride <local> eingetragen ist (immert dann wenn bei lokale Adressen umgehen das Häkchen gesetzt ist) und somit in %curprox% enthalten ist, bricht das Skript mit Syntaxfehler an dieser Stelle ab:
Fällt jemand dazu eine Lösung ein?
Viele Grüße
Jack
ich hab mal eine Frage zu diesem Skript:
Sobald bei ProxyOverride <local> eingetragen ist (immert dann wenn bei lokale Adressen umgehen das Häkchen gesetzt ist) und somit in %curprox% enthalten ist, bricht das Skript mit Syntaxfehler an dieser Stelle ab:
set newprox=www.google.de;%curprox%
Fällt jemand dazu eine Lösung ein?
Viele Grüße
Jack
Moin jackssh,
wenn ich es richtig verstanden habe, steht der String "<local>" in der Variablen %curprox%?
dann (also wenn Du die Sonderzeichen "<" und ">" erwartest) musst ">" und "<" mit einem Caret ("^") maskieren.
Ist zwar lästig, aber nötig.
Beispiel: Statt jetzt: Set newprox=www.gugl.de;%curprox%
[Edit]
Okay, genau genommen reicht eigentlich schon das Setzen des SET-Geraffels in Anführungszeichen.
Grüße
Biber
wenn ich es richtig verstanden habe, steht der String "<local>" in der Variablen %curprox%?
dann (also wenn Du die Sonderzeichen "<" und ">" erwartest) musst ">" und "<" mit einem Caret ("^") maskieren.
Ist zwar lästig, aber nötig.
Beispiel: Statt jetzt: Set newprox=www.gugl.de;%curprox%
::Annahme %curprox% könnte Wert "<local>" haben
set "curprox=%curprox:<=^<%"
set "curprox=%curprox:>=^>%"
:: curprox ist jetzt "maskiert": %curprox%=^<local^>
set newprox=www.google.de;%curprox%
[Edit]
Okay, genau genommen reicht eigentlich schon das Setzen des SET-Geraffels in Anführungszeichen.
set "newprox=www.google.de;%curprox%"
[/Edit]Grüße
Biber