Batch Reg-Key Attribute erstellen?

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 🥱

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Lenzer66u 
Fragesteller
 09.12.2022, 06:37

Danke das war sehr Hilfreich. Werde ich mir gut merken danke!

1

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

Lenzer66u 
Fragesteller
 08.12.2022, 13:25

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

0
Pablo100  08.12.2022, 13:49
@Lenzer66u

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]"

}

0
Lenzer66u 
Fragesteller
 08.12.2022, 13:55
@Pablo100

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

0
Erzesel  09.12.2022, 04:48

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 😉)

0
Pablo100  09.12.2022, 09:29
@Erzesel

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!

0