batch bestimmte stellen in datei schreiben und lesen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren