Batch Reg-Key Attribute erstellen?
Ich habe eine zweite Datei die wie folgt aussieht:
HKEY_CURRENT_USER\test1
Test1
REG_DWORD
6
HKEY_CURRENT_USER\test1
Test2
REG_DWORD
24
und nun will ich ein Batchscript schreiben das aus dieser Liste in den Reg-Keys die Attribute anlegt.
Mein versuch bisher ist schief gegangen weil ich ehrlich gesagt nicht gut weiß wie ich in Batch mit schleifen und Array umgehen muss.
cd /d "%~dp0"
set i = 0
for /f "usebackq tokens=*" %%a in ("Liste.txt") do (
set Inhalt[%i%] = %%a
set i = %i% + 1
)
echo i = %i%
echo inhalt = %Inhalt[0]%
:: REG ADD ...
Meine Idee bestand daraus jede Zeile der Liste einzeln in ein Array zu packen und damit zu REG ADD übergehen aber das Array funktioniert so glaube ich nicht richtig.
2 Antworten
es gibt (egal in welche Programmiersprache) nichts schlimmerer als Daten, welche auf meherere aufeinanderfolgende Zeilen verteilt sind zusammenzuführen.
Das macht das "Ding zu einem wahrhaft unflexiblen Monster (ein kleine Fehler in der Datenfile und das ganze Ding kommt durcheinander).
bad_DataFile.txt (wirklich Übel)
HKEY_CURRENT_USER\test1
Test1
REG_DWORD
6
HKEY_CURRENT_USER\test1
Test2
REG_DWORD
24
HKEY_CURRENT_USER\test1
TestIrgendwas
REG_SZ
blubb
sequentialDataRead.cmd
@echo off
chcp 65001 >nul
rem bei der gruseligen Sache kommen wir nicht um verzögerte variablenexpansion herum 🤮... (hoofentlich kommt nirgends ein Ausrufezeichnen in den Daten der zu lesenden Datei)
setlocal enableDelayedExpansion
set "InputFile=bad_DataFile.txt"
rem die Zeilen beim einlesen Nummerieren
for /f "tokens=1* delims=[]" %%a in ('type "%InputFile%"^|find /v /n ""') do (
rem Daten durch ein Trennzeichen in einem Datensatz zusammenfügen. (Semikolon ";" als Trennzeichen ist Ok kommt quasi nie in Reg-Keys vor)
rem das Ergebnis ist ein CSV-Datensatz im (deutschen) Exelformat
set "_DataLine=!_DataLine!;%%~b"
rem mit Modulorechnung immer die ZeilenNummern in die Zahlen 1 bis 3 und 0 umwandeln (in jeder 4. Zeile (Moduloresultat 0) haben wir alle Daten beisammen.
set /a "_DataCounter=%%a %% 4"
set "_Data" &rem mal anzeigen, damit du weißt wie unser Datensatz (zusammen)wächst, bis der Zähler auf 0 steht
if !_DataCounter! equ 0 (
echo Zähler ist auf !_DataCounter!, jezt mach ich was.&echo:
rem jetzt wo der Zähler auf 0 steht können Wir die zusammengeklaubten Daten mit einem for/f auf Token-Parameter zerlegen und diese dem reg-Befehl übergeben
for /f "tokens=1-3* delims=;" %%k in ("!_DataLine!") do (
reg add "%%k" /v "%%l" /t %%m /d "%%n" /f
reg query "%%k" &rem mal zur Demo anzeigen
)
set "_dataLine=" &rem zurücksetzen
)
)
pause
Warum das ganze Brimborium?
ganz einfach falsches Konzept (schon beim Speichern der Daten)
dabei hätte es Doch so leicht sein können wenn alle daten in einer Zeile im (Exel)CSV-format gespeichert sind (alle benötigten Daten hübsch in einer Zeile):
good_dataFile.txt
HKEY_CURRENT_USER\test2;Test1;REG_DWORD;6
HKEY_CURRENT_USER\test2;Test2;REG_DWORD;24
HKEY_CURRENT_USER\test2;TestIrgendwas;REG_SZ;blubb
CSV_DataRead.cmd (das sieht doch schon viel angenehmer aus):
@echo off
chcp 65001 >nul
set "InputFile=good_DataFile.txt"
for /f "usebackq tokens=1-3* delims=;" %%a in ("%inputFile%") do (
reg add "%%a" /v "%%b" /t %%c /d "%%d" /f
reg query "%%a" &rem mal zur Demo anzeigen
)
pause
Der ganze "Klumpatsch" da Oben ist nur notwendig, weil du die Daten beim speichern auseinandergerissen hast, statt sie zusammenzuhalten. dabei hätte es so einfach sein können:
regOutputToCSV.cmd
@echo off
chcp 65001 >nul
rem mal zur Demo einen (sogar verschachtelten) Registrykey basteln
@(
reg add "hkcu\Test3" /v "irgendwas" /t REG_DWORD /d "4" /f
reg add "hkcu\Test3\SubKey1" /v "wasAnderes" /t REG_SZ /d "blubb" /f
reg add "hkcu\Test3\SubKey2" /v "Zwerg1" /t REG_SZ /d "Pfropfer" /f
reg add "hkcu\Test3\SubKey2" /v "Zwerg2" /t REG_SZ /d "Stopfer" /f
reg add "hkcu\Test3\SubKey1\SubSubKey" /v "Rafunzel" /t REG_DWORD /d "0xFFFFFF" /f
)>nul
set "OutputFile=DataFile.txt"
(call ) >"%OutputFile%" &rem Datei leeren
rem ganzen RegistryPfad mit unterschlüsseln einlesen (Parameter /s)
for /f "tokens=*" %%a in ('reg query "hkcu\Test3" /s') do (
rem teste ob die Zeile ein Key ist
echo "%%a"|find "HKEY_" >nul &&(
rem wenn ja, in Variable speichern
set "_currendKey=%%a"
)||(
rem wenn Nicht ist es ein Wert
rem dann erseten wir 4 aufeinanderfolgende Leerzeichen durch ein Semikolon
rem und speichern es in einer Datei
set "_currendValue=%%a"
>>"%OutputFile%" call echo %%_currendKey%%;%%_currendValue: =;%%
)
)
rem mal anschauen
type "%OutputFile%"
pause
...war doch ganz simpel. (8 kleine Zeilen ohne die Kommentare und Demovorbereitung)
Was Arrays angeht , Batch kennt keine Arrays. Wir tun nur so als gäbe es welche, aber eigentlich basteln wir nur automatisiert einzelne VariablenNamen zusammen, welche sich durch irgendeine Art der Nummerierung voneinander unterscheiden und sich weitgehend wie Arrays verhalten. ArrayName[2] sind folglich Unsinn. Ich verwende etwas in der Art ArrayName.2 (wie man das macht ist jedoch Geschmackssache) .
Folglich geht auch sowas:
regOutputToObjectArray.cmd
@echo off
chcp 65001 >nul
rem wie gehabt...
set "Index=0"
for /f "tokens=*" %%a in ('reg query "hkcu\Test3" /s') do (
echo "%%a"|find "HKEY_" >nul &&(
set "_currendKey=%%a"
)||(
set /a "Index+=1" &rem Index um 1 erhöhen
set "_currendValue=%%a"
call set MeineRegWerte.%%Index%%=%%_currendKey%%;%%_currendValue: =;%%
)
)
)
rem mal die Variablen anschauen
set "MeineRegWerte."
rem speichern der Daten des "Arrays" ist einfach. (schließlich ist schon alles beisammen)
(for /f "tokens=1* delims==" %%a in ('set "MeineRegWerte."') do @(echo %%b))>"DataFile.txt"
pause
Laden kannst Du wieder mit CSV_DataRead.cmd ( InputFile anpassen ! )
oder du lädst die Datei in ein Array und verarbeitest Dieses.
CSV_DataRead to Array.cmd
@echo off
chcp 65001 >nul
set "InputFile=DataFile.txt"
rem Datensätze in Array laden
for /f "tokens=1* delims=[]" %%a in ('type "%inputFile%" ^|find /v /n ""') do ( set "MeinArray.%%a=%%b")
set "MeinArray." &rem mal anzeigen
rem eine bestimmte ArrayVariable schreibst Du in die registry mit:
for /f "tokens=2-4* delims==;" %%a in ('set "MeinArray.1"') do (
reg add "%%a" /v "%%b" /t %%c /d "%%d" /f
)
rem alle arrayvariablen mit:
for /f "tokens=2-4* delims==;" %%a in ('set "MeinArray."') do (
reg add "%%a" /v "%%b" /t %%c /d "%%d" /f
)
pause
viele Wege führen nach Rom.
Wichtig ist nur, das du in der Datei die zusammengehörigen Daten in einer Zeile speicherst. Auch wen das vielleicht nicht hübsch aussieht. Daten aus mehreren Zeilen zusammenzufügen ist schwieriger als einen CSV-Datensatz zu zerlegen.
Feierabend... Nachtschicht fast beendet. in einer halben Stunde kommt meine Ablösung 🥱
Danke das war sehr Hilfreich. Werde ich mir gut merken danke!
Um in einem Batch-Skript aus einer Datei wie in Ihrem Beispiel die Attribute in den Reg-Keys anzulegen, können Sie eine Schleife verwenden, um die Zeilen der Datei zu durchlaufen, und die
REG ADD
-Befehlszeile innerhalb der Schleife ausführen.
Beachten Sie, dass in Batch-Skripten die Syntax für die Definition und Verwendung von Arrays etwas anders ist als in anderen Programmiersprachen. Um ein Array zu erstellen, müssen Sie zunächst eine Variable definieren und ihr einen Array-Wert zuweisen. Die einzelnen Elemente des Arrays werden dann mit dem Index angegeben.
In Ihrem Fall könnte die Schleife z.B. so aussehen:
for /f "usebackq tokens=*" %%a in ("Liste.txt") do ( set Inhalt[%i%] = %%a set i = %i% + 1 )
Innerhalb der Schleife wird jede Zeile der Datei in das Array
Inhalt
gespeichert, wobei der Index mit
%i%
gesteuert wird.
Anschließend können Sie innerhalb der Schleife die
REG ADD
-Befehlszeile verwenden, um die Attribute in den Reg-Keys anzulegen. Sie können dabei die Elemente des Arrays
Inhalt
verwenden, um die notwendigen Werte anzugeben.
Hinweis: Stellen Sie sicher, dass Sie die Befehlszeilen innerhalb der Schleife richtig einrücken und die Anführungszeichen korrekt verwenden, um Syntaxfehler zu vermeiden.
Ein Beispiel für die gesamte Skriptdatei könnte folgendermaßen aussehen:
@echo off cd /d "%~dp0" set i = 0 for /f "usebackq tokens=*" %%a in ("Liste.txt") do (set Inhalt[%i%] = %%a set i = %i% + 1 REG ADD "HKEY_CURRENT_USER\test1" /v "%%a" /t "REG_DWORD" /d "%Inhalt[%i%]" /f )
Mit diesem Skript werden die Attribute aus der Datei
Liste.txt
in den Reg-Keys
HKEY_CURRENT_USER\test1
angelegt. Die Werte für die Attribute werden aus dem Array
Inhalt
entnommen, das innerhalb der Schleife erstellt wird.
Hinweis: Dies ist nur ein Beispiel und muss möglicherweise angepasst werden
Um Ihr Ziel zu erreichen, können Sie eine Schleife verwenden, um jeden Wert aus Ihrem Array zu lesen und die Werte an den Befehl
REG ADD
zu übergeben. Hier ist ein Beispiel in PowerShell:
# Liste der Werte
$values = @("Inhalt1", "Inhalt2", "Inhalt3", "Inhalt4")
# Durchlaufe die Werte und übergebe sie an den Befehl REG ADD
foreach ($value in $values) {
REG ADD Inhalt[1] /v $value /t "Inhalt[3]" /d "Inhalt[4]"
}
ich weiß nur nicht wie ich die Werte aus Meiner zweiten Datei (Liste.exe) in dem das Array bekomme also
Liste:
HKEY_CURRENT_USER\test1
Test
REG_DWORD
6
zu Array Inhalt[]
Inhalt[0] = HKEY_CURRENT_USER\test1
Inhalt[1] = Test
Inhalt[2] = REG_DWORD
Inhalt[3] = 6
hast Du mal ausprobiert, was Du da zusammengepfrimelt hast?
Ein Beispiel für die gesamte Skriptdatei könnte folgendermaßen aussehen:
@echo off cd /d "%~dp0" set i = 0 for /f "usebackq tokens=*" %%a in ("Liste.txt") do (set Inhalt[%i%] = %%a set i = %i% + 1 REG ADD "HKEY_CURRENT_USER\test1" /v "%%a" /t "REG_DWORD" /d "%Inhalt[%i%]" /f )
nein könnte es nicht...
- Von Zeilenvorschüben hast Du wohl noch nichts gehört?
- auf innerhalb eines Forf-Body/Klammerblocks gesetzte Variablen kann nicht mit %Variable% zugegriffen werden
- gerechnet wird mit set /a "var=formel"
Mag ja von Dir gut gemeint sein, aber wenns um die Registry geht, sollte man schon sehr genau wissen was man tut. Reg verzeiht keine Fehler. (bloß gut das Deine Vorschläge so viele crash-Fehler hatten ses es garnich bis zum reg-Befehl kam 😉)
Sie haben recht, dass innerhalb eines
for
-Body/Klammerblocks gesetzte Variablen nicht mit
%Variable%
zugegriffen werden können. In diesem Fall müsste man die Variable mit
!Variable!
anstelle von
%Variable%
referenzieren.
Sie haben auch recht, dass man für Berechnungen innerhalb von Batch-Dateien die
set /a
-Anweisung verwenden sollte.
Ich empfehle Ihnen, sorgfältig zu prüfen, ob Ihr Skript funktioniert, bevor Sie es ausführen. Wenn Sie unsicher sind, wie Sie es verbessern können, empfehle ich Ihnen, sich an einem Forum für Batch-Skripting oder einer anderen Community für technischen Support zu wenden.
Ich hoffe, dass meine Antworten Ihnen geholfen haben und wünsche Ihnen viel Erfolg bei Ihren Bemühungen!
ich bekomme es leider nicht hin. Im Endeffekt soll ja so ungefähr aussehen.
REG ADD Inhalt[1]" /v "Inhalt[2]" /t "Inhalt[3]" /d "Inhalt[4]"
einfach das jede Zeile aus der Liste im Array an eine neue stelle kommen von 1-4