batch bestimmte stellen in datei schreiben und lesen?
wie kann ich eine batch ganz betsimmte stellen in dateien lesen un schreiben lasse
bsp.: (nur das was in klammern steht soll gelesen/geändert werden)
name=hallo
number=[10]
text=hallo nummer 10
1 Antwort
erstmal etwas Grundlagen um Dateien:
Textdateien werden immer (und in jeder Sprache) Zeile für Zeile gelesen. Ein Zugriff irgendwo in die Mitte ist nicht möglich. Ergo muss man die die gesamte Datei einlesen , verarbeiten und komplett zurückschreiben. In anderen Sprachen kein Akt.
Hier zeigt sich eine Schwäche von Batch. Batch hat keine unproblematische/unkomplizierte Möglichkeit den Inhalt der Datei im Speicher zu halten.
Im einfachsten und sichersten Fall ließt man die Datei Zeilenweise , schreibt den geänderten Inhalt in eine temporäre Datei und verschiebt diese anschließend in die Originaldatei.
test.ini
Name=Frieda
Alter=10
Anmerkung=grüne Haare
blah=blub
Das Einlesen und verarbeiten erfolgt mit einem for/f-Loop
demo.cmd
@echo off
chcp 65001 >nul
set "neuerWert=12"
set "myFile=test.ini"
rem lies datei test.ini
rem teile jede Zeile am Delimiter = in 1.Token und Rest %%a enthält 1.Token %%b den Rest
for /f "usebackq tokens=1* delims==" %%a in ("%myFile%") do (
if /i "%%a"=="Alter" (
>>"%myFile%.temp" echo %%a=%neuerWert%
) else (
>>"%myFile%.temp" echo %%a=%%b
)
)
move "%myFile%.temp" "%myFile%" >nul
pause
die folgende variante kommt ohne temporäre Datei aus, aber dann muss sicher sein, das der Schleifenrumpf absolut fehlerfrei arbeitet, sonst ist die Datei futsch.
@echo off
chcp 65001 >nul
set "neuerWert=12"
set "myFile=test.ini"
rem lies datei test.ini mit type und übergib die Daten als ganzes in den Buffer von for/f
rem !!!!und überschreibe die Originaldatei mit nichts!!!
for /f "tokens=1* delims==" %%a in ('type "%myFile%" ^& call ^>"%myFile%"') do (
if /i "%%a"=="Alter" (
>>"%myFile%" echo %%a=%neuerWert%
) else (
>>"%myFile%" echo %%a=%%b
)
)
pause
so kompliziert sollte man es nur machen wenn man Werte bearbeiten möchte mit welchen die Batch nicht selbst arbeitet.
Das schreiben und einlesen von in Batch verwendeten Variablen kan super einfach sein.
Gib einfach allen Variablen, welche gespeichert werden sollen ein gemeinsamen Präfix. (ich habe mich an __@. gewöht) .
@echo off
chcp 65001 >nul
rem variablen, welche gespeichert und gelesen werden sollen
set "__@.Name=Frieda"
set "__@.Alter=10"
set "__@.Anmerkung=grüne Haare"
set "__@.blah=blub"
set "myFile=test2.ini"
set "neuerWert=12"
rem schreibe alle variablen welche mit __@. beginnen in Datei
set "__@." >"%myFile%"
echo das wurde gespeichert:
type "%myFile%"
echo:
rem lösche alle Variablen welche mit __@. beginnen
for /f "tokens=1 delims==" %%a in ('set "__@."') do (set "%%a=")
rem mal schauen ob sie weg sind...
set "__@."
rem lies alle Variablen aus Datei wieder ein...
for /f "usebackq tokens=*" %%a in ("%myFile%") do (set "%%a")
rem mal schauen ob sie wieder da sind sind...
set "__@."
set "__@.Alter=%neuerWert%"
set "__@.Anmerkung=rote Haare"
rem und wieder Speichern
set "__@." >"%myFile%"
echo das wurde gespeichert:
type "%myFile%"
echo:
pause
Mit jeweils einer Zeile kann man ein ganzes Paket von Variablen Anzeigen, Schreiben, Lesen oder Löschen.