sarekhl
Goto Top

Zeichenfolge in Textdatei durch Inhalt einer Umgebungsvariable ersetzen

Hallo zusammen,

wie kann ich mittels Batch in einer Textdatei die Zeichenfolge #### durch den Inhalt der Umgebungsvariable %username% ersetzen?


Danke im Voraus,
Sarek \\//_

Content-Key: 277410

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

Ausgedruckt am: 29.03.2024 um 04:03 Uhr

Mitglied: rubberman
rubberman 15.07.2015 um 21:12:49 Uhr
Goto Top
Hallo Sarek,

Batch ist da keine gute Idee, aber da du schon fragst ...

  • Datei zeilenweise einlesen (FOR /F)
    • Zeileninhalt einer Variablen zuweisen
    • Verzögerte Variablenerweiterung einschalten
    • Textersetzung, á la set "var=!var:####=%username%!" durchführen
    • Variableninhalt per ECHO-Umleitung in eine andere Datei schreiben
    • Verzögerte Variablenerweiterung ausschalten
  • ggf. alte durch neue Datei per MOVE /Y ersetzen

Grüße
rubberman
Mitglied: SarekHL
SarekHL 15.07.2015 um 21:17:53 Uhr
Goto Top
Batch ist da keine gute Idee, aber da du schon fragst ...

Warum nicht? Wenn ich mir die Kommentare unserer Batch-Experten hier anschaue, dann haben die schon viel komplexere Dateioperationen per Batch mit zwei Zeilen Code hinbekommen, wo ich, der ich normalerweise in VBS/VB6 arbeite, mindestens zehn Zeilen gebraucht hätte.


* Datei zeilenweise einlesen (FOR /F)
    • Zeileninhalt einer Variablen zuweisen
    • Verzögerte Variablenerweiterung einschalten
    • Textersetzung, á la set "var=!var:####=%username%!" durchführen
    • Variableninhalt per ECHO-Umleitung in eine andere Datei schreiben
    • Verzögerte Variablenerweiterung ausschalten
  • ggf. alte durch neue Datei per MOVE /Y ersetzen

Tja, weiter bin ich nun immer noch nicht ...
Mitglied: rubberman
Lösung rubberman 15.07.2015 aktualisiert um 22:05:17 Uhr
Goto Top
Hallo Sarek.

Warum nicht?
Weil Textersetzung in Batch ein unsicheres Unterfangen ist. Du kannst nicht jedes beliebige Zeichen ersetzen, es gibt Ausnahmen.

Tja, weiter bin ich nun immer noch nicht ...
Ach so, du möchtest den Code komplett vorgekaut bekommen. Ungetestet in den Browser geschrieben ...
@echo off &setlocal DisableDelayedExpansion
>"test2.txt" (  
  for /f usebackq^ delims^=^ eol^= %%i in ("test1.txt") do (  
    set "line=%%i"  
    setlocal EnableDelayedExpansion
    echo(!line:####=%username%!
    endlocal
  )
)
move /y "test2.txt" "test1.txt"  
In dieser einfachen Version verschwinden evtl. vorkommende Leerzeilen allerdings spurlos.

Grüße
rubberman
Mitglied: SarekHL
SarekHL 15.07.2015 um 21:51:44 Uhr
Goto Top
Zitat von @rubberman:

> Warum nicht?
Weil Textersetzung in Batch ein unsicheres Unterfangen ist. Du kannst nicht jedes beliebige Zeichen ersetzen, es gibt Ausnahmen.

OK, das ist blöd. Ist das "#" denn ersetzbar? Sonst baue ich einen anderen Platzhalter in die Vorlage-Textdatei.


Ach so, du möchtest den Code komplett vorgekaut bekommen.

Die ganzen DELIMS & Co. verstehe ich hinten und vorne nicht ...

Ungetestet in den Browser geschrieben ...

Funktioniert leider nicht, die Zieldatei ist leer (0 Bytes Länge)
Mitglied: rubberman
Lösung rubberman 15.07.2015 aktualisiert um 22:05:10 Uhr
Goto Top
die Zieldatei ist leer (0 Bytes Länge)
Für den Fall, dass du den Code nicht verstanden hast: Die Quell- und Zieldatei ist "test1.txt". Die Datei "test2.txt" ist temporär und verschwindet wieder. Sollte es trotzdem nicht funktionieren, liegt deine Datei nicht im ANSI Zeichensatz vor (denn mittlerweile habe ich die Funktionstüchtigkeit des Codes geprüft).

Grüße
rubberman
Mitglied: SarekHL
SarekHL 15.07.2015 aktualisiert um 22:05:01 Uhr
Goto Top
Zitat von @rubberman:

Für den Fall, dass du den Code nicht verstanden hast: Die Quell- und Zieldatei ist "test1.txt". Die Datei "test2.txt" ist temporär und verschwindet wieder.

Ich habe die letzte Zeile zum Testen weggelassen, damit bleibt die test2.txt

Sollte es trotzdem nicht funktionieren, liegt deine Datei nicht im ANSI Zeichensatz vor (denn mittlerweile habe ich die Funktionstüchtigkeit des Codes geprüft).

Genau so? Mir fiel auf, dass eine Klammer mehr geöffnet als wieder geschlossen wird ...

Habe die Datei gerade mit Notepad++ in ANSI konvertiert, nun geht es ...

Danke!
Mitglied: rubberman
rubberman 15.07.2015 um 22:20:45 Uhr
Goto Top
Mir fiel auf, dass eine Klammer mehr geöffnet als wieder geschlossen wird ...
Das ist Absicht. Sie folgt direkt auf ECHO (ohne Leerzeichen dazwischen) und ist die bessere Alternative zu einem Punkt, der sonst häufig an dieser Stelle zu finden ist. (Nur zur Erklärung...)

Du kannst testweise Zeile 3 wie folgt ändern, um dir die Konvertierung der Datei zu ersparen (kommt darauf an in welchem Zeichensatz sie vorliegt):
  for /f delims^=^ eol^= %%i in ('type "test1.txt"') do (

Grüße
rubberman