thoper
Goto Top

Per Batch in einer Textdatei nach einem String suchen und dann gesamte Zeile ersetzen

Hallo Community,

ich habe folgendes Problem mit einer Batch, die mir zwei Zeilen in einer Textdatei ersetzen soll. Zunächst habe ich dieses funktionierende Script genutzt um die beiden Zeilen zu ersetzen:

@echo off
	setlocal disableDelayedExpansion
	set "datei=C:\Users\%username%\Desktop\test.js"  
	set "tmpdatei=%temp%\tmp.txt"   

if exist C:\Users\%username%\Desktop\test.js (
	GOTO :beginnersetzen ) else (
	goto :eof)

:beginnersetzen

>"%tmpdatei%" (  
  for /f "tokens=1* delims=:" %%A in ('findstr /n "^" "%datei%"') do (  
    if %%A==1 (
       echo user_pref("abc.app.filename", "file:///D:/%COMPUTERNAME%.txt"^);  
    ) else if %%A==2 (
       echo user_pref("abc.app.URL", "file:///D:/%COMPUTERNAME%.txt"^);  
    ) else echo(%%B
  )
)

move /y "%tmpdatei%" "%datei%"  

Nun ist es aber so, dass der zu ersetzende Text nicht unbedingt an Stelle X oder Y (hier Zeile 1 und 2) auftaucht, d.h. dass ich nach einer bestimmten Zeichenkette ( z.B. abc.app.filename und abc.app.URL ) suchen müsste um dann die komplette Zeile zu ersetzen. Mit folgendem Versuch die for-Schleife zu ändern bin ich bislang gescheitert:

>"%tmpdatei%" (  
  for /f "tokens=1* delims=:" %%A in ('findstr /c "^" "%datei%"') do (  
    if %%A==abc.app.filename (
       echo user_pref("abc.app.filename", "file:///D:/%COMPUTERNAME%.txt"^);  
    ) else if %%A==abc.app.URL (
       echo user_pref("abc.app.URL", "file:///D:/%COMPUTERNAME%.txt"^);  
    ) else echo(%%A
  )
)

Das funktioniert solange in der Zeile auch nur die genaue Zeichenkette

abc.app.filename

steht, aber die Zeile sieht in etwas so aus:

user_pref("abc.app.filename", "file:///D:/test.txt");

Und dann funktioniert es mit dem Ersetzen leider nicht und die geänderte Zeile sieht im Ergebnis so aus:

user_pref("abc.app.filename", "file

Die Zeile wird am Ende also einfach beschnitten. Leider sind meine Kenntnisse rudimentär und ich komme an dieser Stelle nicht mehr weiter. Eventuell nutze ich einfach nur den falschen Schalter für findstr?! Ich hoffe, mir kann jemand bei der Lösung dieses Problems helfen!

Thoper

Content-Key: 201534

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

Printed on: April 19, 2024 at 02:04 o'clock

Member: bastla
bastla Feb 11, 2013 updated at 09:20:40 (UTC)
Goto Top
Hallo Thoper und willkommen im Forum!

Wenn es bei den (nur) 2 Ersetzungen bleibt, ungetestet etwa so:
@echo off & setlocal disableDelayedExpansion
set "datei=C:\Users\%username%\Desktop\test.js"  
set "tmpdatei=%temp%\tmp.txt"   

if not exist "C:\Users\%username%\Desktop\test.js" goto :eof  

>"%tmpdatei%" (  
for /f "tokens=1* delims=:" %%A in ('findstr /n "^" "%datei%"') do (  
    echo "%%B"|findstr "abc\.app\.filename" >nul && (  
        echo user_pref("abc.app.filename", "file:///D:/%COMPUTERNAME%.txt"^);  
    ) || (
        echo "%%B"|findstr "abc\.app\.URL" >nul && (  
            echo user_pref("abc.app.URL", "file:///D:/%COMPUTERNAME%.txt"^);  
        ) || (
            echo(%%B
        )  
    )
)
)

move "%tmpdatei%" "%datei%">nul  
Kurze Erklärung: Da die mit "findstr /n" erzeugte Zeile ja so aussieht:
Zeilennummer:Zeilentext
steht in %%A eben die Zeilennummer und der Zeilentext selbst ist in %%B zu finden. Durch die Angabe von "tokens=1* delims=:" wurde festgelegt, dass das Trennzeichen ":" nur einmal berücksichtigt werden soll, sodass der Zeilentext nicht "zerrissen" wird.

Grüße
bastla
Member: Thoper
Thoper Feb 11, 2013 at 09:49:22 (UTC)
Goto Top
Hallo bastla,

herzlichen Dank für die super schnelle Hilfe! Das funktioniert soweit! face-smile

Es gibt aber noch eine Fehlerausgabe. Diese habe ich mal in eine Textdatei umgeleitet:

Der Befehl "PT");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "PT");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "D");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "D");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "T");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "T");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "U");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "U");"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Diese Fehler müssten sich auf folgende Zeilen in der Datei beziehen, in der ich die Änderungen vornehmen möchte:

user_pref("PrintSettings.Default.FooterStrLeft", "&PT");
user_pref("PrintSettings.Default.FooterStrRight", "&D");
user_pref("PrintSettings.Default.HeaderStrLeft", "&T");
user_pref("PrintSettings.Default.HeaderStrRight", "&U");

Wie kann man das noch ausmerzen?

Und ich muss auch ganz ehrlich sagen, dass ich nicht so ganz Deine Änderungen nachvollziehen kann. Könntest Du mir bitte noch kommentieren, was an dieser Stelle genau passiert:

echo "%%B"|findstr "abc\.app\.filename" >nul && (
echo user_pref("abc.app.filename", "file:///D:/%COMPUTERNAME%.txt"^);

Würde das gerne verstehen! face-smile Nochmals vielen Dank!!

Gruß,
Thoper
Member: bastla
bastla Feb 11, 2013 updated at 10:13:10 (UTC)
Goto Top
Hallo Thoper!

Lass in den Zeilen 9 und 12 die Anführungszeichen um %%B herum weg ...
echo "%%B"|findstr "abc\.app\.filename" >nul && (  
    echo user_pref("abc.app.filename", "file:///D:/%COMPUTERNAME%.txt"^);  
) ||

Grüße
bastla

P.S.: Die Zeile 5 wäre so:
if not exist "%datei%" goto :eof
auch noch sinnvoller (weil änderungsfreundlicher).
Member: Thoper
Thoper Feb 11, 2013 at 12:53:46 (UTC)
Goto Top
Läuft jetzt einwandfrei! Nochmals ganz herzlichen Dank, auch für Deine Erklärung und den Tipp! Echt super!

Thoper