psar04
Goto Top

Batch-Skript IF-Anweisung mit Klammer in Variable funktioniert nicht

Hallo,

folgendes Problem: Ich möchte ein Batch-Skript erstellen, welches innerhalb einer Textdatei eine bestimmte Zeile durch eine andere ersetzt. Dazu wird die Textdatei Zeile für Zeile mit einer for-Schleife ausgelesen und alle Zeilen, die nicht der gesuchten Zeile entsprechen werden direkt in ein neues Textdokument geschrieben. Wenn das Skript auf die gesuchte Zeile trifft, wird hingegen eine andere Zeile in die neue Textdatei geschrieben.

Hier erstmal der Code-Schnipsel:
@echo off & setlocal

set Text=BeispielText(123)abc

Type Nul >C:\NeueDatei.txt
for /f "tokens=1* delims=:" %%A in ('findstr /N "^" "C:\AlteDatei.txt"') do if %%A==3 (echo %Text%>>C:\NeueDatei.txt) else (echo/%%B>>C:\NeueDatei.txt)  

Wenn ich die Batchdatei so ausführe, fehlt allerdings die geänderte Zeile komplett in der neuen Textdatei. Das Problem hängt mit den Klammern in dem neuen Text zusammen (Variable "Text"). Wenn ich die schließende Klammer hinter der 3 weglasse (also "BeispielText(123abc") klappt nämlich alles. Außerdem klappt auch alles einwandfrei, wenn ich in dem IF-Befehl die neue Zeile hart eintrage und vor die Klammer ein ^ hinzufüge (also "echo BeispielText(123^)abc>>C:\NeueDatei.txt").
Nun meine Frage, wie bekomme ich es hin, dass ich die Klammer und die Variable verwenden kann?

Content-Key: 191740

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

Printed on: April 16, 2024 at 08:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Sep 24, 2012 updated at 18:15:47 (UTC)
Goto Top
moin PSaR04,

erstmal danke für die sehr ausfühliche Beschreibung.

Die schliesende Klammer in der Variable wird nicht Maskiert und daher wird sie so behandelt, als wäre sie die Schliesende Klammer der if Anweisung.
Du kannst die Maskierung schon zur Aufnahme in die Variable benutzen.
set "text=Beispiel^(123^&weiteres^|^)"
Die Variable lässt sich auch richtig mit delayedexpansion benutzen.
@echo off
setlocal disabledelayedexpansion

set "Text=Beispie mit (klammer1234)text"  

findstr /n "^" "C:\altedatei.txt" >"%temp%\%~n0tmp.txt"  
3>"D:\neue Datei" (  
 for /f usebackqdelims^= %%i in ("%temp%\%~n0tmp.txt" ) do (  
  set "Line=%%i"  
  setlocal enabledelayedexpansion
  for /f "delims=:" %%h in ("%%i") do if %%h equ 3 (>&3 echo(!Text!) else >&3 echo(!Line:*:=!  
  endlocal
))
del "%temp%\%~n0tmp.txt"  

Gruß Phil
Member: PSaR04
PSaR04 Sep 24, 2012 at 18:29:32 (UTC)
Goto Top
Hallo pieh-ejdsch,

danke für die schnelle Antwort, ich probiere das mal aus, aber ich denke, dass ich damit klarkomme.

Gruß
Patrick
Member: PSaR04
PSaR04 Sep 24, 2012 at 19:02:28 (UTC)
Goto Top
Hallo,

vielen Dank nochmal, jetzt läuft alles. Hier noch mal der funktionierende Code:

@echo off & setlocal

set "text=Beispiel^(123^)abc"  

Type Nul >C:\NeueDatei.txt
for /f "tokens=1* delims=:" %%A in ('findstr /N "^" "C:\AlteDatei.txt"') do if %%A==3 (echo %Text%>>C:\NeueDatei.txt) else (echo/%%B>>C:\NeueDatei.txt)  

Gruß
PSaR04