tomost
Goto Top

Registrywert mittels Batch ändern

Tag zusammen,
ich hab hier im Forum schon ein wenig geforscht aber leider nicht die passende Lösung gefunden, bzw. gefunden schon, klappt aber bei meiner Datei nicht.
Ich möchte mittels einer batch einen Teil der Registry in eine textdatei exportieren, darin einen Wert ändern und dann wieder in die Registry importieren.
Ex- und import ist kein Problem das schaff ich, nur den Wert ändern, da haperts.
Ich hab hier im Forum schon ein vbs script gefunden was search and replace macht, aber damit wird meine txt Datei zerstört.
Ich vermute es liegt daran das jede menge Sonderzeichen ({,@,:, usw.) darin enthalten sind.
Um genauer zu werden:
Ich möchte in meiner export-datei die folgenden Inhalt hat:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}]
@="Netzwerkadapter"
"Class"="Net"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\Descriptions]
"Broadcom NetXtreme 57xx Gigabit Controller"=hex(7):31,00,00,00,00,00
"Intel(R) PRO/Wireless 3945ABG Network Connection"=hex(7):31,00,00,00,00,00
"Asynchroner RAS-Adapter"=hex(7):31,00,00,00,00,00
"WAN-Miniport (L2TP)"=hex(7):31,00,00,00,00,00
"WAN-Miniport (PPTP)"=hex(7):31,00,00,00,00,00
"WAN-Miniport (PPPOE)"=hex(7):31,00,00,00,00,00
"Parallelanschluss (direkt)"=hex(7):31,00,00,00,00,00
"WAN-Miniport (IP)"=hex(7):31,00,00,00,00,00
"Deterministic Network Enhancer Miniport"=hex(7):31,00,00,00,32,00,00,00,33,00,\
00,00,34,00,00,00,00,00
"Cisco Systems VPN Adapter"=hex(7):31,00,00,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{008BFB96-5C7B-43B5-ACCC-012F2C0710D9}]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{008BFB96-5C7B-43B5-ACCC-012F2C0710D9}\Connection]
"PnpInstanceID"="ROOT\\NET\\0000"
"MediaSubType"=dword:00000001
"Name"="LAN-Verbindung 2"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{5549A6BD-AD05-47EF-947C-E709B5981798}]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{5549A6BD-AD05-47EF-947C-E709B5981798}\Connection]
"PnpInstanceID"="PCI\\VEN_14E4&DEV_1600&SUBSYS_01C21028&REV_02\\4&378EDFA4&0&00E2"
"MediaSubType"=dword:00000001
"Name"="LAN-Verbindung"
"ShowIcon"=dword:00000000
"IpCheckingEnabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{A41ED87D-7219-48F7-8BE5-11257E5B80CF}]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{A41ED87D-7219-48F7-8BE5-11257E5B80CF}\Connection]
"PnpInstanceID"="PCI\\VEN_8086&DEV_4222&SUBSYS_10218086&REV_02\\4&360A6DE&0&00E1"
"MediaSubType"=dword:00000002
"Name"="Drahtlose Netzwerkverbindung"
"ShowIcon"=dword:00000000
"IpCheckingEnabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{DD9675F8-99EB-4ED3-ADA9-F70C33A90BFB}]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{DD9675F8-99EB-4ED3-ADA9-F70C33A90BFB}\Connection]
"PnpInstanceID"="ROOT\\NET\\0000"
"MediaSubType"=dword:00000001
"Name"="LAN-Verbindung 3"


Die Zeile, oder Zeilen
"ShowIcon"=dword:00000000
durch
"ShowIcon"=dword:00000001

ersetzen.

Ich will eigentlich "nur" das Icon für die Netzwerkkarte IMMER und für jeden User in der Taskleiste anzeigen lassen. (Windows XP)
Und das mit Bordmitteln, da ich nur dafür nicht extra Software kaufen und installieren möchte.
Da wir die Software mittels Symantec LiveState Delivery verteilen und Installieren, brauch ich eben die Bordmittel.
Ich hoffe es kann mir jemand helfen.

Danke schonmal
tomost

Content-ID: 73736

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

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

bastla
bastla 16.11.2007 um 21:32:10 Uhr
Goto Top
Hallo tomost und willkommen im Forum!

Ich hab hier im Forum schon ein vbs script gefunden was search and replace macht, aber damit wird meine txt Datei zerstört.
Hoffentlich meintest Du in einem anderen Forum ...

Für hier würde ich mir nämlich eher so etwas erwartet haben:
'SetShowIconInRegFile.vbs  
Set fso = CreateObject("Scripting.FileSystemObject")  
sNewRegText = Replace(fso.OpenTextFile(WScript.Arguments(0), 1).ReadAll, _
	"""ShowIcon""=dword:00000000", """ShowIcon""=dword:00000001")  
fso.OpenTextFile(WScript.Arguments(1), 2, True).Write sNewRegText
damit bei einem Aufruf der Art
cscript //nologo C:\Scripts\SetShowIconInRegFile.vbs OldRegFile.txt NewRegFile.txt
nix zerstört, sondern sogar noch etwas neu geschaffen wird. face-wink

Grüße
bastla

[Edit] Inzwischen hat ahe erklärt, wie es zur "Zerstörung" gekommen sein dürfte: Du hast versucht, unmittelbar die exportierte Datei zu verändern, ohne sie vorher in eine (ASCII/ANSI-)Textdatei zu konvertieren - damit käme auch mein obiges Script nicht zurecht, daher gibt es unten die Unicode-taugliche Variante. [/Edit]
ahe
ahe 17.11.2007 um 13:47:01 Uhr
Goto Top
Hallo Bastla,

wäre es nicht wünschenswert das Ganze direkt über die Reg-Datei laufen zu lassen, ohne den Zwischenschritt über die Txt-Datei?

Ich bastel (allerdings mit wenig Erfolg) an einer Batch Lösung und mußte feststellen, dass es einige Probleme zu umschiffen gibt.

Das Problem ist, dass Reg-Dateien im Unicode Format abgespeichert werden. Durch die folgende Zeile kann man die Datei dann in ANSI umwandeln, womit dann auch diverse bordeigene Tools dann keine Probleme mehr haben (z. B. FINDSTR):
type org_export.reg >neu_export.reg

Wenn man jetzt Dein VB Script über die Datei neu_export.reg laufen läßt, dann funktioniert es, sonst kommt (bei mir) leider etwas sehr komisches heraus... face-smile

(laut .reg-Datei mit CMD oder VBS auslesen sollte es ja mit dem Parameter True eigentlich ja gehen...)

Bei meinen Tests mittels Batch hatte ich bislang mit der Ersetzung von den Werten ein Problem:

Ich ging 'mal davon aus, dass die exportieren Regdateien für jeden Rechner unterschiedlich aussehen.

Wenn die ID's immer identisch wären, wäre es ja mit den folgenden Zeilen oder einer eigenen Reg-Datei getan:

set "KEY=HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"  

REG ADD "%KEY%\{5549A6BD-AD05-47EF-947C-E709B5981798}\Connection" /V ShowIcon /t REG_DWORD /d 1  
REG ADD "%KEY%\{A41ED87D-7219-48F7-8BE5-11257E5B80CF}\Connection" /V ShowIcon /t REG_DWORD /d 1  
...

Da aber vermutlich diverse unterschiedliche Netzwerkkarten mit eigenen ID's im Einsatz sind, muss man die Reg-Datei durchsuchen.

Ich weiss nicht, welche Tests schon gemacht wurden...

Falls es mit findstr versuchst wurde, muss als erstes die Reg-Datei von Unicode nach ANSI umgewandelt werden (umbenennen reicht da nicht!). Z. B. so: type network.reg >.\network2.reg
Danach bekommst man auch etwas zurück (bei mir z. B.):
findstr "ShowIcon" network2.reg  

"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000000  

Alternativ funktioniert der Befehl find auch direkt auf Reg-Dateien.

find "ShowIcon" .\network.reg  

---------- .\NETWORK.REG
"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000001  
"ShowIcon"=dword:00000000  


Script-Idee "geklaut" von einem Deiner 'älteren' Scripts und Bibers Batch-Tut's auf Basis der ANSI-Datei:

Dabei soll die Reg-Datei zeilenweise durchgegangen werden und diese Zeilen in eine neue Datei hineingeschrieben werden. Die Ersetzung des alten Eintrags durch den neuen Eintrag soll dabei durch folgendes gemacht werden:
set Line=!Line:%Von%=%Nach%!

Der gesamte Code:
@echo off & setlocal enabledelayedexpansion
set "Datei=%temp%\network.reg"  
set "NeueDatei=%temp%\neu_network.reg"  
set "Von="ShowIcon"=dword:00000000"  
set "Nach="ShowIcon"=dword:00000001"  
if exist "%NeueDatei%" del "%NeueDatei%"  
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%NeueDatei%"  

Leider funktioniert diese Lösung nicht, ich denke es liegt zum Einen an den vielen Hockkommas und zum Anderen wieder einmal an der Auswertungsreihenfolge der Parameter... (die Datei neu_network.reg wird nicht erzeugt...) oder aber an den vielen Sonderzeichen in der Reg-Datei...

mfg
Axel
Biber
Biber 17.11.2007 um 15:28:26 Uhr
Goto Top
Moin ahe,

für den letzten Teil Deiner Lösungsansatzes würde ich eine andere Strategie wählen.
Zwei Batch-Eigenheiten (die bei bastla's Ansatz mit VBSkript gar nicht relevant sind) müssen berücksichtigt werden.

1. In den Reg-Dateien sind einige der LeerZEILEN erforderlich, damit es sich mit RegEdit wieder importieren lässt.
Und die FOR/F-Anweisung ignoriert (de facto) Leerzeilen und gibt von daher auch keine aus.
2. Ein anderes Problem ist gleich an zwei Stellen das Gleichheitszeichen.
Wenn Du es am CMD-Prompt testest, siehst du, dass ein Ersetzen eines Strings in einer Variable mit "Gleichheitszeichen-im-Wert"
mit der eingebauten CMD-Ersetz-Funktion Akrobatik ist, wenn nicht gar unmöglich.
set varbla="Bla"=blubb  
$cmd$echo Origin[%varbla%] Clone[%varbla:blubb=sülz%]
Origin["Bla"=blubb] Clone["Bla"=sülz]  
## soweit okay, aber jetzt die Variante, die Du versuchst:
$cmd$echo Origin[%varbla%] Clone[%varbla:"Bla"=blubb="Bla"=sülz%]  
Origin["Bla"=blubb] Clone[blubb="Bla"=sülz=blubb]  
-->wie Du siehst, wird ab dem ersten =-Zeichen ersetzt....

Also würde ich (falls bastla und seine Lösungen grad nicht greifbar wären und ich irgendwas aus Batch zaubern müsste) es so machen:

::---CloneReg.bat 
@echo off & setlocal
If "%~1"=="" %0 network.reg  
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ "%~1"') do (  
 if "%%j"=="" (echo.) ELSE (    
 For /f "delims== tokens=1,2*" %%x in ("%%j") do (  
    If "%%y"=="" (echo %%x) ELSE (   
    If /i "%%~x"=="ShowIcon" (echo %%x=dword:00000001) Else echo %%x=%%y  
))))

Diese CloneReg.bat aufrufen mit dem dem Namen der Originaldatei (z.B. Network.reg) und, falls mir das Ergebnis auf dem Bildschirm zusagt, das ganze nochmal aufrufen und das Ergebnis umleiten in eine neue Datei.
CloneReg %temp%\network.reg >>neu_network.reg.

Aber, wie Du siehst, ist eine Batch-Lösung hier im Vergleich zu VBSkript elendiglich lang.

Grüße
Biber
bastla
bastla 17.11.2007 um 17:28:14 Uhr
Goto Top
Hallo ahe!

wäre es nicht wünschenswert das Ganze direkt über die Reg-Datei laufen zu lassen, ohne den Zwischenschritt über die Txt-Datei?
Abgesehen davon, dass die Txt-Datei nicht meine Erfindung war, hast Du natürlich Recht - das macht dann aber das Script natürlich länger (besonders, wenn ich das Ergebnis auch wieder in Unicode schreibe - noch ein " ,True" mehr face-wink):
'SetShowIconInNativeRegFile.vbs  
Set fso = CreateObject("Scripting.FileSystemObject")  
sNewRegText = Replace(fso.OpenTextFile(WScript.Arguments(0), 1, , True).ReadAll, _
	"""ShowIcon""=dword:00000000", """ShowIcon""=dword:00000001")  
fso.OpenTextFile(WScript.Arguments(1), 2, True, True).Write sNewRegText

Grüße
bastla
ahe
ahe 19.11.2007 um 09:59:39 Uhr
Goto Top
Hallo Ihr,

ich sollte mich wohl doch mehr mit VB Script befassen (seufz) ... face-smile

@Biber: Beim Herumprobieren hatte ich zwischendurch auch schon 'mal den Effekt, dass alles, was hinter dem Gleichheitszeichen war, abgetrennt war. Die erzeugte Reg-Datei sah dann doch recht seltsam aus... face-smile

Ich glaube auch, dass Bastla's Lösung der elegantere Weg ist.

@bastla: In Unicode schreiben ist ja eigentlich hier nicht notwendig (es sei denn, man hat es mit speziellen Zeichen aus dem Unicode Bereich zu tun, bei DWORD hoffentlich seltener).
Deine Lösung ist, finde ich, schön kurz und verständlich, im Gegensatz zur der "elendiglich" langen Batchlösung (sorry Biber face-smile)

Ich denke ich muss mir doch 'mal die Parameter von OpenTextFile genauer anschauen.

mfg
Axel
bastla
bastla 19.11.2007 um 12:40:05 Uhr
Goto Top
@ahe
In Unicode schreiben ist ja eigentlich hier nicht notwendig
Vermutlich nicht - ich hab's vor allem zu Demozwecken verwendet, und weil ich dann mit "fc /b" Original- und bearbeitete Datei leicht vergleichen konnte.

Grüße
bastla
Biber
Biber 19.11.2007 um 12:50:23 Uhr
Goto Top
@bastla, @ahe

Schön, dass wir alle darüber gesprochen haben, aber dennoch:

@tomost aka ThreadOwner
Liest Du noch mit und möchtest Du auch mal zu Wort kommen?
Ist die Frage für Dich beantwortet oder eher zerredet?


Bitte um Feedback
Biber
tomost
tomost 20.11.2007 um 09:51:17 Uhr
Goto Top
Hallo zusammen,
sorry leute, ich war bis inkl. gestern krank.
Sobald ich meine Mails durch hab werde ich mir mal alles anschauen und meinen "Senf" dazugeben.

Danke schonmal.

tomost
tomost
tomost 20.11.2007 um 10:59:51 Uhr
Goto Top
Hallo Leute,
ich bin begeistert.
Mit dem script
'SetShowIconInNativeRegFile.vbs
Set fso = CreateObject("Scripting.FileSystemObject")
sNewRegText = Replace(fso.OpenTextFile(WScript.Arguments(0), 1, , True).ReadAll, _
"""ShowIcon""=dword:00000000", """ShowIcon""=dword:00000001")
fso.OpenTextFile(WScript.Arguments(1), 2, True, True).Write sNewRegText

funktionierts perfekt.

Herzlichen Dank an alle.
Grüße
tomost