m-k-d-b
Goto Top

Batch zum automatischen Bearbeiten eines Wertes

Hallo,


ich versuche mich gerade daran, einen Wert in der Registry per Batch zu bearbeiten, komme aber nicht so wirklich weiter.

Was soll die Batch können?

Die Batch soll einen Wert (z. B. den Wert AppInit_dlls unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows) auslesen.
Für den Fall, dass sich dort bestimmte Pfade (z. B. C:\ordner\unterordner\datei.dll) befinden, sollen diese Pfade aus den Daten gelöscht werden. Beim Wert "AppInit" ist es ja z. B. so, dass sich hier mehrere verschiedene Pfade befinden können.

Dies erscheint mir deutlich schwerer zu sein als das "einfache" Löschen, Leeren oder Hinzufügen eines Wertes.

Könnt Ihr mir diesbezüglich eventuell behilflich sein?

Vielen Dank.

Content-ID: 227167

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

certifiedit.net
certifiedit.net 21.01.2014 um 16:56:13 Uhr
Goto Top
Hallo,

hilft dir das weiter: http://support.microsoft.com/kb/310516
M-K-D-B
M-K-D-B 21.01.2014 um 17:15:51 Uhr
Goto Top
Hallo certifiedit,

vielen Dank für deine schnelle Antwort.


Diese Seite kenn ich zur Genüge, es hilft mir leider gar nicht weiter, trotzdem danke schon mal.

Ich versuche derzeit, das oben beschriebene Problem mit einer for Schleife in den Griff zu bekommen, aber wie man einen neuen Wert auf einen alten "legt", weiß ich nicht.
certifiedit.net
certifiedit.net 21.01.2014 um 17:19:07 Uhr
Goto Top
Nun prinzipiell geht das per regedit Import per "überschreiben" - ich denke, das lässt sich auch per Batch abbilden, hab ich aber bisher soweit nie gemacht, da solche Anpassungen noch nie im Enterprise Sektor anfielen und für 3-4 PCs lohnt es sich nicht entsprechend zu skripten.

"regedit /s <regdatei>"
oder eben reg --?

sollte dir weiter helfen.
M-K-D-B
M-K-D-B 21.01.2014 aktualisiert um 17:30:35 Uhr
Goto Top
Hallo,

Nun prinzipiell geht das per regedit Import per "überschreiben" - ich denke, das lässt sich auch per Batch
abbilden, hab ich aber bisher soweit nie gemacht, da solche Anpassungen noch nie im Enterprise Sektor anfielen und für 3-4
PCs lohnt es sich nicht entsprechend zu skripten.

"regedit /s <regdatei>"
oder eben reg --?

sollte dir weiter helfen.
Verstehe ich dich richtig?
Du meinst, ich solle den Wert exportieren, dann z. B. mit find oder findstr das entsprechene suchen lassen und dann wieder einfügen?
certifiedit.net
certifiedit.net 21.01.2014 um 17:41:07 Uhr
Goto Top
Genau, oder, wenn es immer derselbe ist: Einfach dort hineinpacken, entweder per file.reg oder eben per reg importieren. ;)

Im Zweifelsfall, wenn es nicht unterschiedliche Werte sein müssen brauchst du gar keine Abfrage ob, ein pures überschreiben kostet dich im @all weniger Zeit und Aufwand.
mech01
mech01 21.01.2014 um 18:47:24 Uhr
Goto Top
Moin,

muss es zwangsläufig Batch sein? WSH wäre doch eigentlich besser für diese Aufgabe geeignet oder?

LG
colinardo
colinardo 21.01.2014, aktualisiert am 22.01.2014 um 11:27:18 Uhr
Goto Top
Hallo M-K-D-B,
einfaches Powershell-Script genügt:
(In Zeile 3 die Pfade eintragen die entfernt werden sollen ; mit Komma getrennt)
$key = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"  
# Hier die Pfade eintragen die entfernt werden sollen
$valuesToRemove = @("C:\test.dll","V:\reg.dll")  
$arrValues = (Get-ItemProperty $key -Name "AppInit_DLLs").AppInit_DLLs.Replace('"',"").Split(",")  
$newValues = ""  
$valuesToRemove | %{$arrValues = $arrValues -notlike $_}
$arrValues | %{$newValues += """$_"","}  
$newValues = $newValues.TrimEnd(",")  
Set-ItemProperty $key -Name "AppInit_DLLs" -Value $newValues  
Grüße Uwe
M-K-D-B
M-K-D-B 21.01.2014 um 19:30:08 Uhr
Goto Top
Hallo,

vielen Dank schon mal für die weiteren Antworten. face-smile


p.s. was noch wichtig wäre, sind die Pfade in AppInit_DLLs bei dir mit [http://support.microsoft.com/kb/197571/de
Leerzeichen oder mit Komma] voneinander getrennt ?
Durch Komma.

Kann mir jemand sagen, warum folgendes nicht funktioniert?

regedit /e "%temp%\export_AppInit_dlls.reg" "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"
findstr /v /i /c:"C:\\ordner\\unterordner\\datei.dll," "%temp%\export_AppInit_dlls.reg" >> "%temp%\import_AppInit_dlls.reg"
regedit /S "%temp%\import_AppInit_dlls.reg"
del /f/q "%temp%\export_AppInit_dlls.reg" 2>nul 1>nul
del /f/q "%temp%\import_AppInit_dlls.reg" 2>nul 1>nul
pause

Der Fehler muss in der 2. zeile liegen, denn mit der option "/v" sollte eigentlich alles außer der String "C:\\ordner\\unterordner\\datei.dll," in die import.reg befördert werden, tut es aber nicht.

Hier der Inhalt meiner export_AppInit_dlls.reg:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"IconServiceLib"="IconCodecService.dll"
"DdeSendTimeout"=dword:00000000
"DesktopHeapLogging"=dword:00000001
"GDIProcessHandleQuota"=dword:00002710
"ShutdownWarningDialogTimeout"=dword:ffffffff
"USERNestedWindowLimit"=dword:00000032
"USERPostMessageLimit"=dword:00002710
"USERProcessHandleQuota"=dword:00002710
@="mnmsrvc"
"DeviceNotSelectedTimeout"="15"
"Spooler"="yes"
"TransmissionRetryTimeout"="90"
"AppInit_DLLs"="C:\\ordner\\unterordner\\datei.dll,"


Es soll quasi "AppInit_DLLs"="" importiert werden. Was muss ich unter findstr ändern?


Vielen Dank!
colinardo
colinardo 21.01.2014 aktualisiert um 21:34:43 Uhr
Goto Top
wieso so umständlich? wenn du einfach alles aus dem Wert AppInit_DLLs herauslöschen möchtest machst du das einfach so:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /d "" /f
Bitte formuliere dein Anliegen das nächste mal klarer, am Anfang wolltest du nur bestimmte Pfade aus einem Wert herauslöschen und auf einmal alles.

Grüße Uwe
Endoro
Endoro 21.01.2014 um 20:22:56 Uhr
Goto Top
Zitat von @M-K-D-B:
Es soll quasi "AppInit_DLLs"="" importiert werden. Was muss ich unter findstr ändern?

Hey,
Findstr unterstützt keine 2Byte-Zeichensätze. Du kannst es mit find versuchen.
Gruss.
M-K-D-B
M-K-D-B 22.01.2014 um 07:17:35 Uhr
Goto Top
Guten Morgen,

Zitat von @colinardo:

wieso so umständlich? wenn du einfach alles aus dem Wert AppInit_DLLs herauslöschen möchtest machst du das
einfach so:
> reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /d "" /f
> 
Bitte formuliere dein Anliegen das nächste mal klarer, am Anfang wolltest du nur bestimmte Pfade aus einem Wert
herauslöschen und auf einmal alles.
mein Anliegen habe ich im ersten Post klar formuliert. Da beispielsweise im Wert AppInit_Dlls verschiedene Pfade vorliegen können, möchte ich bestimmte Pfade daraus entfernen können. Der von dir genannte Befehl zur Leerung des o. g. Wertes ist mir wohl bekannt. face-smile
Der Pfad "C:\Ordner\unterordner\datei.dll," dient lediglich als "einfaches Beispiel".
Vielen Dank, dass du dran bleibst. face-smile


Zitat von @Endoro:
Hey,
Findstr unterstützt keine 2Byte-Zeichensätze. Du kannst es mit find versuchen.
Gruss.
Danke für den Tipp, ich werde es heute Nachmittag austesten. face-smile
Sheogorath
Lösung Sheogorath 22.01.2014, aktualisiert am 23.01.2014 um 15:58:13 Uhr
Goto Top
Moin,

Zum auslesen und ändern könntest du hiermit arbeiten:
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs >%temp%\var.txt  
SET /p oldpath=<%temp%\var.txt

del /f/q "%temp%\var.txt" >nul  

Gruß
Chris
M-K-D-B
M-K-D-B 22.01.2014 um 16:17:15 Uhr
Goto Top
Hallo,


Findstr unterstützt keine 2Byte-Zeichensätze. Du kannst es mit find versuchen.
Gruss.
danke für den Tipp, aber find löscht mir den ganzen Wert aus der .reg Datei raus.
M-K-D-B
M-K-D-B 22.01.2014 um 17:17:16 Uhr
Goto Top
Hallo Chris,


Zum auslesen und ändern könntest du hiermit arbeiten:

REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs >%temp%\var.txt
SET /p oldpath=<%temp%\var.txt

del /f/q "%temp%\var.txt" >nul
danke für deine Anregung. Komme zwar mit deiner 2. Zeile nicht klar bzw. weiß noch nicht, wie ich von hier weitermachen soll, aber ich schaus mir mal an. face-smile
colinardo
colinardo 22.01.2014 aktualisiert um 17:26:22 Uhr
Goto Top
Powershell-Script das das gewüschte alles erledigt ...
(In Zeile 3 jeweils die Pfade mit Komma getrennt eintragen die aus AppInit_DLLs entfernt werden sollen)
$key = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"  
# Hier die Pfade eintragen die entfernt werden sollen
$valuesToRemove = @("C:\test.dll","V:\reg.dll")  
$arrValues = (Get-ItemProperty $key -Name "AppInit_DLLs").AppInit_DLLs.Replace('"',"").Split(",")  
$newValues = ""  
$valuesToRemove | %{$arrValues = $arrValues -notlike $_}
$arrValues | %{$newValues += """$_"","}  
$newValues = $newValues.TrimEnd(",")  
Set-ItemProperty $key -Name "AppInit_DLLs" -Value $newValues  
Probiers halt mal aus face-wink
Grüße Uwe
M-K-D-B
M-K-D-B 22.01.2014 aktualisiert um 18:21:18 Uhr
Goto Top
Hallo Uwe,


Zitat von @colinardo:

Powershell-Script das das gewüschte alles erledigt ...
(In Zeile 3 jeweils die Pfade mit Komma getrennt eintragen die aus AppInit_DLLs entfernt werden sollen)
> $key = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"  
> # Hier die Pfade eintragen die entfernt werden sollen
> $valuesToRemove = @("C:\test.dll","V:\reg.dll")  
> $arrValues = (Get-ItemProperty $key -Name
> "AppInit_DLLs").AppInit_DLLs.Replace('"',"").Split(",")  
> $newValues = ""  
> $valuesToRemove | %{$arrValues = $arrValues -notlike $_}
> $arrValues | %{$newValues += """$_"","}  
> $newValues = $newValues.TrimEnd(",")  
> Set-ItemProperty $key -Name "AppInit_DLLs" -Value $newValues  
> 

Probiers halt mal aus face-wink
Grüße Uwe
vielen Dank für dein Powershell-Script, nur muss ich gestehen, dass ich mich damit (Powershell) überhaupt nicht auskenne...
Kann man mit batch ein powershell-script ausführen?
Ich schau mal, dass ich zu Informationen komme...
colinardo
colinardo 22.01.2014, aktualisiert am 27.06.2014 um 18:19:43 Uhr
Goto Top
Zitat von @M-K-D-B:
vielen Dank für dein Powershell-Script, nur muss ich gestehen, dass ich mich damit (Powershell) überhaupt nicht
auskenne...
Kann man mit batch ein powershell-script ausführen?
klar
Ich schau mal, dass ich zu Informationen komme...
back-to-topAnleitung: Wie starte ich Powershell-Scripte
  • Zuerst speicherst man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script in der Konsole mit Eingabe des kompletten Pfades der Scriptdatei, oder mit einem Rechtsklick auf die Script-Datei :Mit Powershell ausführen gestartet werden.
back-to-topStarten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
"C:\Pfad\script.ps1"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
back-to-topMethoden zum Starten von PS-Scripten aus Batch und Kommendozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
.
Endoro
Endoro 22.01.2014 um 20:31:09 Uhr
Goto Top
Zitat von @M-K-D-B:
danke für den Tipp, aber find löscht mir den ganzen Wert aus der .reg Datei raus.

find löscht die "Null"-Bytes aus dem UTF-16LE, sonst nichts.
Gruss.
Sheogorath
Lösung Sheogorath 23.01.2014 aktualisiert um 15:58:26 Uhr
Goto Top
Moin,

die 2. Code-Zeile liest die erste Zeile aus %temp%\var.txt, welche deine Registry Value darstellen sollte.

Meine Lösung würde so aussehen, da ich feststellen musste, dass reg query ja in mehreren Zeilen auswirft:
FOR /F "tokens=3 skip=2" %%i IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs') DO SET "oldpath=%%i"  
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /d "%oldpath:zuersetzenderstring=%" /f   

Infos zum ersetzen von Strings:
http://ss64.com/nt/syntax-replace.html

und zu der Query:
http://www.computerbase.de/forum/showthread.php?t=148837&p=1450674# ...

möglicherweise musst du die tokenanzahl anpassen, wenn du Leerzeichen in der Value hast. und eben den zu ersetzenden String

Ganz ohne Powershell und Co :P

Gruß
Chris
M-K-D-B
M-K-D-B 23.01.2014 aktualisiert um 15:59:47 Uhr
Goto Top
Hallo,


Zitat von @Sheogorath:
Infos zum ersetzen von Strings:
http://ss64.com/nt/syntax-replace.html
auf der Seite war ich gestern auch schon, hab aber bei %variable:StrToFind=NewStr% wohl zu kompliziert gedacht. face-smile


Zitat von @Sheogorath:
FOR /F "tokens=3 skip=2" %%i IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows  
> NT\CurrentVersion\Windows" /v AppInit_DLLs') DO SET "oldpath=%%i"  
> reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /d  
> "%oldpath:zuersetzenderstring=%" /f   
> 
und zu der Query:
http://www.computerbase.de/forum/showthread.php?t=148837&p=1450674# ...
das funktioniert sehr gut. face-smile


möglicherweise musst du die tokenanzahl anpassen, wenn du Leerzeichen in der Value hast. und eben den zu ersetzenden String
Ja, stimmt.


Vielen Dank Chris and an alle anderen, die hier Zeit investiert haben! face-smile