Mit batch string suchen und danach text einfügen
Hallo zusammen, ich hoffe es hat einer eine Idee. Ich bin leider nicht so fit in der Programmierung, um dieses Problem selber lösen zu können.
Ich habe eine .txt mit folgendem Inhalt:
text1
text2
text3
;zyklischer Aufruf
text...
text...
Mit einer Batch möchte ich jetzt in der Datei suchen, und nach dem Suchstring einen Textblock einfügen, hier im Beispiel erst mal nur eine Zeile.
Diesen Code hab ich hier aus dem Forum, er funktioniert auch soweit ganz gut.
Aber: beginnt die Zeile in meine.txt mit einem "&", dann wird in der Datei diese Zeile gelöscht und dafür "Echo ist off." rein geschrieben.
Beispiel:
&text1
&text2
text3
;zyklischer Aufruf
text...
text...
Ich habe eine .txt mit folgendem Inhalt:
text1
text2
text3
;zyklischer Aufruf
text...
text...
Mit einer Batch möchte ich jetzt in der Datei suchen, und nach dem Suchstring einen Textblock einfügen, hier im Beispiel erst mal nur eine Zeile.
@echo off & setlocal
set "Datei=C:\meine.txt"
set "Suchen=;zyklischer Aufruf"
set "Einfügen=neue Zeile mit einem Text"
set "Bak=%temp%\txt.bak"
move "%Datei%" %Bak%
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do (set "Zeile=%%j" & call :ProcessLine)
goto :eof
:ProcessLine
if not defined Zeile (>>"%Datei%" echo\ & goto :eof)
if "%Zeile%" neq "%Suchen%" (>>"%Datei%" echo %Zeile% & goto :eof)
>>"%Datei%" echo %Zeile%
>>"%Datei%" echo %Einfügen%
goto :eof
Aber: beginnt die Zeile in meine.txt mit einem "&", dann wird in der Datei diese Zeile gelöscht und dafür "Echo ist off." rein geschrieben.
Beispiel:
&text1
&text2
text3
;zyklischer Aufruf
text...
text...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 174475
Url: https://administrator.de/contentid/174475
Ausgedruckt am: 22.11.2024 um 10:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo snowdream!
Ich würde das eher so schreiben:
Grüße
bastla
[Edit] Korrektur für Ausgabe von Leerzeilen vorgenommen [/Edit]
Diesen Code hab ich hier aus dem Forum
... wo er aber sicher etwas schöner war (was sich aber noch nachholen lässt ) ...Ich würde das eher so schreiben:
@echo off & setlocal
set "Datei=C:\meine.txt"
set "Suchen=;zyklischer Aufruf"
set "Einfügen=neue Zeile mit einem Text"
set "Bak=%temp%\txt.bak"
move "%Datei%" %Bak%
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do (set "Zeile=%%j" & call :ProcessLine)
goto :eof
:ProcessLine
(
setlocal enabledelayedexpansion
echo\!Zeile!
if "%Zeile%"=="%Suchen%" echo %Einfügen%
endlocal
)>>"%Datei%"
goto :eof
bastla
[Edit] Korrektur für Ausgabe von Leerzeilen vorgenommen [/Edit]
Hallo snodream,
versuch es mal mit einer leicht abgeänderten Variante.
Die Probleme können unter anderem vorher in der Zeile
auftreten, wenn z.B. in Zeile etwas in der Art
jeb
versuch es mal mit einer leicht abgeänderten Variante.
Die Probleme können unter anderem vorher in der Zeile
if "%Zeile%"=="%Suchen%" echo %Einfügen%
"Meins&Deins" & seins
@echo off
setlocal DisableDelayedExpansion
set "Datei=C:\meine.txt"
set "Suchen=;zyklischer Aufruf"
set "Einfügen=neue Zeile mit einem Text"
set "Bak=%temp%\txt.bak"
move "%Datei%" %Bak%
(
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %Bak%') do (
setlocal enabledelayedexpansion
set "Zeile=%%j"
(echo(!Zeile!)
if "!Zeile!"=="!Suchen!" echo(!Einfügen!
endlocal
)
) > "%Datei%"
jeb
Hallo snowdream,
Ja, sollte eigentlich direkt so klappen
Weil alles was innerhalb des Block ausgegeben wird, in die Zieldatei umgeleitet wird.
jeb
Zitat von @snowdream:
Hallo jeb,
das funktioniert mit meiner "Problem-Datei", Weltklasse!
Kannst du mir vielleicht noch verraten, wie ich den statt dem "echo(!Einfügen!" in Zeile 14 eine type-befehl
einbinden kann => type c:\einfügen.txt ?
Hallo jeb,
das funktioniert mit meiner "Problem-Datei", Weltklasse!
Kannst du mir vielleicht noch verraten, wie ich den statt dem "echo(!Einfügen!" in Zeile 14 eine type-befehl
einbinden kann => type c:\einfügen.txt ?
Ja, sollte eigentlich direkt so klappen
if "!Zeile!"=="!Suchen!" type einfügen.txt
Weil alles was innerhalb des Block ausgegeben wird, in die Zieldatei umgeleitet wird.
jeb
Hallo snowdream!
Kann eigentlich der Suchstring auch mehrfach in der Datei vorkommen? Falls nein, würde ich eine Anleihe bei den Kollegen diesem Thread) nehmen und das so versuchen:
Kurzer Hinweis zur Zeile 19: Falls es nach der Zeile mit dem Suchtext weniger als %Versatz% Zeilen gibt, wird dadurch nicht die letzte gefundene Zeile mehrfach in die Zieldatei geschrieben, sondern die fehlenden Quellzeilen werden durch Leerzeilen ersetzt ...
Grüße
bastla
Kann eigentlich der Suchstring auch mehrfach in der Datei vorkommen? Falls nein, würde ich eine Anleihe bei den Kollegen diesem Thread) nehmen und das so versuchen:
@echo off & setlocal DisableDelayedExpansion
set "Datei=C:\meine.txt"
set "Suchen=;zyklischer Aufruf"
set /a Versatz=2
set "Einf=C:\einfügen.txt"
set "ZeilenNr="
for /f "delims=:" %%i in ('findstr /n /c:"%Suchen%" "%Datei%"') do set /a ZeilenNr=%%i
if not defined ZeilenNr (
echo "%Suchen%" in "%Datei%" nicht gefunden!
goto :eof
)
set /a ZeilenNr+=Versatz
set "Bak=%temp%\txt.bak"
move "%Datei%" %Bak%
(
for /l %%i in (1,1,%ZeilenNr%) do (
set "Zeile="
set /p "Zeile="
setlocal enabledelayedexpansion
echo(!Zeile!
endlocal
)
)<%Bak% >"%Datei%"
>>"%Datei%" type "%Einf%"
>>"%Datei%" more +%ZeilenNr% %Bak%
Grüße
bastla