Mit batch string suchen und danach text einfügen
snowdream (Level 1) - Jetzt verbinden
11.10.2011, aktualisiert 18.10.2012, 6769 Aufrufe, 18 Kommentare
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...
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...
18 Antworten
- LÖSUNG bastla schreibt am 11.10.2011 um 21:41:06 Uhr
- LÖSUNG snowdream schreibt am 12.10.2011 um 08:43:38 Uhr
- LÖSUNG bastla schreibt am 12.10.2011 um 10:38:05 Uhr
- LÖSUNG jeb-the-batcher schreibt am 12.10.2011 um 12:52:10 Uhr
- LÖSUNG snowdream schreibt am 12.10.2011 um 14:05:48 Uhr
- LÖSUNG bastla schreibt am 12.10.2011 um 14:58:58 Uhr
- LÖSUNG jeb-the-batcher schreibt am 12.10.2011 um 15:09:45 Uhr
- LÖSUNG snowdream schreibt am 12.10.2011 um 15:57:25 Uhr
- LÖSUNG snowdream schreibt am 12.10.2011 um 15:13:16 Uhr
- LÖSUNG bastla schreibt am 12.10.2011 um 16:45:59 Uhr
- LÖSUNG jeb-the-batcher schreibt am 12.10.2011 um 16:57:40 Uhr
- LÖSUNG snowdream schreibt am 12.10.2011 um 17:03:04 Uhr
- LÖSUNG snowdream schreibt am 12.10.2011 um 16:59:16 Uhr
- LÖSUNG snowdream schreibt am 17.10.2011 um 16:51:34 Uhr
- LÖSUNG bastla schreibt am 17.10.2011 um 19:49:38 Uhr
- LÖSUNG snowdream schreibt am 18.10.2011 um 07:42:46 Uhr
- LÖSUNG bastla schreibt am 18.10.2011 um 12:32:25 Uhr
- LÖSUNG snowdream schreibt am 18.10.2011 um 13:52:06 Uhr
- LÖSUNG bastla schreibt am 18.10.2011 um 12:32:25 Uhr
- LÖSUNG snowdream schreibt am 18.10.2011 um 07:42:46 Uhr
- LÖSUNG bastla schreibt am 17.10.2011 um 19:49:38 Uhr
- LÖSUNG snowdream schreibt am 17.10.2011 um 16:51:34 Uhr
- LÖSUNG bastla schreibt am 12.10.2011 um 16:45:59 Uhr
- LÖSUNG jeb-the-batcher schreibt am 12.10.2011 um 15:09:45 Uhr
- LÖSUNG bastla schreibt am 12.10.2011 um 14:58:58 Uhr
- LÖSUNG bastla schreibt am 12.10.2011 um 10:38:05 Uhr
- LÖSUNG snowdream schreibt am 12.10.2011 um 08:43:38 Uhr
LÖSUNG 11.10.2011 um 21:41 Uhr
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 formatiert 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]
LÖSUNG 12.10.2011 um 08:43 Uhr
Hallo Bastla,
besten Dank für deine Hilfe, läuft fast super. Allerdings wird, wenn Leerzeilen im Text vorhanden sind, zusätzlich immer eine Zeile mit "ECHO ist ausgeschaltet (OFF)." eingefügt.
Beispspie meine.txt:
Kann man das auch noch unterdrücken?
Vielen Dank schon mal.
besten Dank für deine Hilfe, läuft fast super. Allerdings wird, wenn Leerzeilen im Text vorhanden sind, zusätzlich immer eine Zeile mit "ECHO ist ausgeschaltet (OFF)." eingefügt.
Beispspie meine.txt:
&text1
&text2
text3
;zyklischer Aufruf
text4
text5
Vielen Dank schon mal.
LÖSUNG 12.10.2011 um 10:38 Uhr
LÖSUNG 12.10.2011 um 12:52 Uhr
LÖSUNG 12.10.2011 um 14:05 Uhr
Hallo Bastla,
läuft jetzt perfekt mit der Testdatei. Danke nochmal.
Allerdings scheint es nicht wirklich mit jeder beliebigen Textdatei zu funktionieren, die bat bricht bei einigen Text-Dateien einfach ab.
Wie ich drauf komme? Ich habe den Part mit der Tempdatei abgeändert
von
set "Bak=%temp%\txt.bak"
nach
set "Bak=C:\txt.bak"
Vor dem letzen "goto :eof" in Zeile 19 lösche ich dann die temporäre Datei mit "del %bak%" wieder. Mit der Testdatei, wie weiter oben beschrieben, funktioniert alles, die Temp-Datei wird angelegt und auch wieder gelöscht. Bei meiner wirklich zu bearbeitenden Datei bricht die Batch einfach ab (läuft nicht bis zum Ende durch), da die txt.bak nicht gelöscht wird. Ich muss mal noch ein wenig probieren ob ich raus finden kann, an was das genau liegt. Das kann allerdings etwas dauern, da ich momentan wenig Zeit dafür habe.
Gruß
snowdream
läuft jetzt perfekt mit der Testdatei. Danke nochmal.
Allerdings scheint es nicht wirklich mit jeder beliebigen Textdatei zu funktionieren, die bat bricht bei einigen Text-Dateien einfach ab.
Wie ich drauf komme? Ich habe den Part mit der Tempdatei abgeändert
von
set "Bak=%temp%\txt.bak"
nach
set "Bak=C:\txt.bak"
Vor dem letzen "goto :eof" in Zeile 19 lösche ich dann die temporäre Datei mit "del %bak%" wieder. Mit der Testdatei, wie weiter oben beschrieben, funktioniert alles, die Temp-Datei wird angelegt und auch wieder gelöscht. Bei meiner wirklich zu bearbeitenden Datei bricht die Batch einfach ab (läuft nicht bis zum Ende durch), da die txt.bak nicht gelöscht wird. Ich muss mal noch ein wenig probieren ob ich raus finden kann, an was das genau liegt. Das kann allerdings etwas dauern, da ich momentan wenig Zeit dafür habe.
Gruß
snowdream
LÖSUNG 12.10.2011 um 14:58 Uhr
LÖSUNG 12.10.2011 um 15:09 Uhr
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%"
LÖSUNG 12.10.2011 um 15:13 Uhr
Hallo bastla,
ich meinte es so:
Statt dem "Echo %Einfügen%" soll alles aus "c:\einfügen.txt" eingefügt werden. Funktioniert auch, halt aber nur mit bestimmten Text-Dateien.
Gruß
snowdream
ich meinte es so:
@echo off & setlocal
set "Datei=C:\meine.txt"
set "Suchen=;zyklischer Aufruf"
set "Bak=C:\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%" type c:\einfügen.txt
endlocal
)>>"%Datei%"
del %bak%
goto :eof
Gruß
snowdream
LÖSUNG 12.10.2011 um 15:57 Uhr
LÖSUNG 12.10.2011 um 16:45 Uhr
LÖSUNG 12.10.2011 um 16:57 Uhr
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
jeb
LÖSUNG 12.10.2011 um 16:59 Uhr
so läuft es jetzt perfekt:
Danke an bastla & jeb für die schnelle Hilfe!
@echo off
setlocal DisableDelayedExpansion
set "Datei=C:\meine.txt"
set "Suchen=;zyklischer Aufruf"
set "Einfügen=C:\einfügen.txt "
del %temp% /f /q
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!" type %Einfügen%
endlocal
)
) > "%Datei%"
LÖSUNG 12.10.2011 um 17:03 Uhr
Zitat von @bastla:
Hallo snowdream!
Abgesehen von der Tatsache, dass "del %bak%" weiterhin vor dem falschen "goto :eof" steht - gibt es ev
einen Anhaltspunkt, was die Dateien, für die es nicht funktioniert, gemeinsam haben?
Grüße
bastla
Hallo snowdream!
Abgesehen von der Tatsache, dass "del %bak%" weiterhin vor dem falschen "goto :eof" steht - gibt es ev
einen Anhaltspunkt, was die Dateien, für die es nicht funktioniert, gemeinsam haben?
Grüße
bastla
nein, leider nicht...
LÖSUNG 17.10.2011 um 16:51 Uhr
LÖSUNG 17.10.2011, aktualisiert 18.10.2012
Hallo snowdream!
Kann eigentlich der Suchstring auch mehrfach in der Datei vorkommen? Falls nein, würde ich eine Anleihe bei den Kollegen rubberman, Friemler und PH (in 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 rubberman, Friemler und PH (in 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
LÖSUNG 18.10.2011 um 07:42 Uhr
Hallo bastla, genau da liegt das Problem, den Suchstring gibt es zum Teil mehrmals. Hier ein Beispiel:
Text1
gleicher_Text
Suchstring
Text2
gleicher_Text
Suchstring
Text3
Text4
Ich möchte jetzt nur nach dem 1. Suchstring einfügen, also vor Text3. Mein Ansatz ist gewesen, in diesem Fall nach Text1 zu suchen und dann einfach 2 Zeilen danach einzufügen.
Ja, das hätte ich etwas besser beschreiben sollen! Somit funktioniert dein Codebeispiel nicht, wenn ich das richtig verstanden habe.
Gruß
snowdream
LÖSUNG 18.10.2011 um 12:32 Uhr
LÖSUNG 18.10.2011 um 13:52 Uhr