Batch Ersetzen von Wörtern führt zu löschen von Absätzen
Guten Abend,
ich habe da mal erneut eine Frage an die Batch-Affinen unter euch. Ich habe dieses ähnliche Problem schon einmal gepostet, da konnte mir keiner so richtig helfen.
Deshalb versuche ich es erneut.
Zunächst der grobe Aufbau meines Batch Programmes. Ich habe eine Text Datei (keywords.txt) indem ein Index und zwei Wörtern angegeben sind, die getauscht werden sollen. Nun starte ich die Batch Datei, diese nimmt aus dem Ordner Source eine Datei und dupliziert diese so oft, je nachdem wie hoch der Index aus der Text Datei ist. Also bei Index 8, wird die Datei aus Source 8 mal dupliziert und dann von 1-8 nummeriert. Nun liest die Batch Datei aus der Text Datei das 1. Tauschwort aus und tauscht dieses in den duplizierten Dateien je nachdem welche Nummer diese hat. Beispiel: In Datei 3 wird das Wort Dut1 gegen das Wort Dut3 getauscht. In Datei 4 dann gegen Dut4 usw.
Diese Funktion läuft auch und macht soweit keine Probleme (man mag es kaum glauben). Jedoch macht das Programm eine Sache die ich nicht verstehe. Zum Teil werden Absätze einfach gelöscht. Jedoch nicht alle! Manche bleiben vorhanden.
Vor dem Tausch:
variables{
msTimer timerForCyclicUpdateDesiredValueOfDut1;
}
Sollwerte, Funktionsaufschaltungen und Rampen vom AUSY verarbeiten
Nach dem Tausch:
variables{
msTimer timerForCyclicUpdateDesiredValueOfDut4;
}
Wieso werden nur gewisse Absätze gelöscht.
Hier mein Code den ich zum tauschen nutze:
Da mein Code komplett funktioniert und bis auf den einen kleinen Fehler nicht perfekt läuft, wäre PowerShell keine Alternative. Falls jemand eine andere Lösung zum ersetzen der Wörter hat, wäre ich natürlich auch bereit diese zu testen. Vielen Dank schonmal für die Hilfe!
Markus
ich habe da mal erneut eine Frage an die Batch-Affinen unter euch. Ich habe dieses ähnliche Problem schon einmal gepostet, da konnte mir keiner so richtig helfen.
Deshalb versuche ich es erneut.
Zunächst der grobe Aufbau meines Batch Programmes. Ich habe eine Text Datei (keywords.txt) indem ein Index und zwei Wörtern angegeben sind, die getauscht werden sollen. Nun starte ich die Batch Datei, diese nimmt aus dem Ordner Source eine Datei und dupliziert diese so oft, je nachdem wie hoch der Index aus der Text Datei ist. Also bei Index 8, wird die Datei aus Source 8 mal dupliziert und dann von 1-8 nummeriert. Nun liest die Batch Datei aus der Text Datei das 1. Tauschwort aus und tauscht dieses in den duplizierten Dateien je nachdem welche Nummer diese hat. Beispiel: In Datei 3 wird das Wort Dut1 gegen das Wort Dut3 getauscht. In Datei 4 dann gegen Dut4 usw.
Diese Funktion läuft auch und macht soweit keine Probleme (man mag es kaum glauben). Jedoch macht das Programm eine Sache die ich nicht verstehe. Zum Teil werden Absätze einfach gelöscht. Jedoch nicht alle! Manche bleiben vorhanden.
Vor dem Tausch:
variables{
msTimer timerForCyclicUpdateDesiredValueOfDut1;
}
Sollwerte, Funktionsaufschaltungen und Rampen vom AUSY verarbeiten
Nach dem Tausch:
variables{
msTimer timerForCyclicUpdateDesiredValueOfDut4;
}
Wieso werden nur gewisse Absätze gelöscht.
Hier mein Code den ich zum tauschen nutze:
set /a loop=0
:inta
set /a loop=%loop%+1
SET "quell_datei=cache\%KlausDieter:~0,-5%%loop%.cin"
SET "ziel_datei=cache1\%KlausDieter:~0,-5%%loop%.cin"
SET "suchen_nach=%Torsten%1"
SET "ersetzen_durch=%Torsten%%loop%"
IF NOT DEFINED suchen_nach (ECHO. Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ers !zeile!
)
GOTO :wer
:ers
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!
IF [!zeile!] EQU (ECHO.>>%ziel_datei%) ELSE (ECHO. !zeile!>>%ziel_datei%) 2>NUL
GOTO :eof
:wer
set installel=%errorlevel%
if %loop%==%count% goto fall
if %installel%==0 goto inta
:fall
Da mein Code komplett funktioniert und bis auf den einen kleinen Fehler nicht perfekt läuft, wäre PowerShell keine Alternative. Falls jemand eine andere Lösung zum ersetzen der Wörter hat, wäre ich natürlich auch bereit diese zu testen. Vielen Dank schonmal für die Hilfe!
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3678238451
Url: https://administrator.de/contentid/3678238451
Ausgedruckt am: 25.11.2024 um 00:11 Uhr
11 Kommentare
Neuester Kommentar
Wieso werden nur gewisse Absätze gelöscht.
Deswegen:FINDSTR . "%quell_datei%"
Du suchst hiermit nach mindestens einem Zeichen (.) in der Zeile, eine Leerzeile hat aber keine sichtbaren Zeichen, deswegen werden Leerzeilen im For-Loop nicht berücksichtigt und somit übersprungen. MitFINDSTR "^" "%quell_datei%"
Umleitungen in Dateien sollte man immer vor das echo schreiben denn sonst machen Nummern an den Zeilenenden Fehler wegen der Streams
Von Sonderzeichen will ich gar nicht erst anfangen.
Alder Schwede, wer macht Suchen und Ersetzen ehrlich produktiv in Programmcode noch mit Batch?? Lord Pomeroy?🙉
:ers
SET "zeile=!zeile:%suchen_nach%=%ersetzen_durch%!"
>>%ziel_datei% echo.!zeile!
GOTO :eof
Alder Schwede, wer macht Suchen und Ersetzen ehrlich produktiv in Programmcode noch mit Batch?? Lord Pomeroy?🙉
set /a loop=0
:inta
set /a loop+=1
SET "quell_datei=cache\%KlausDieter:~0,-5%%loop%.cin"
SET "ziel_datei=cache1\%KlausDieter:~0,-5%%loop%.cin"
SET "suchen_nach=%Torsten%1"
SET "ersetzen_durch=%Torsten%%loop%"
IF NOT DEFINED suchen_nach (ECHO. Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)
del "%ziel_datei%" >nul 2>&1
FOR /f "tokens=1,* delims=:" %%a IN ('type "%quell_datei%" ^| FINDSTR /n "^"') DO (
CALL :ers "%%b"
)
GOTO :wer
:ers
set "zeile=%~1"
if defined zeile set "zeile=!zeile:%suchen_nach%=%ersetzen_durch%!"
>>"%ziel_datei%" echo.!zeile!
GOTO :eof
:wer
set installel=%errorlevel%
if %loop%==%count% goto fall
if %installel%==0 goto inta
:fall
echo.
i'm out.
Ungetestet:
Wenn's das nicht tut, schau mal per HEX Editor in die Datei, was du da als Zeilenumbruch siehst, wo es nicht funktioniert.
Steffen
:inta
set /a "loop+=1"
setlocal DisableDelayedExpansion
SET "quell_datei=cache\%KlausDieter:~0,-5%%loop%.cin"
SET "ziel_datei=cache1\%KlausDieter:~0,-5%%loop%.cin"
SET "suchen_nach=%Torsten%1"
SET "ersetzen_durch=%Torsten%%loop%"
setlocal EnableDelayedExpansion
<"!quell_datei!" >"!ziel_datei!" (
for /f %%i in ('type "!quell_datei!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (
set "zeile=" & set /p "zeile="
if not defined zeile (
echo(
) else (
echo(!zeile:%suchen_nach%=%ersetzen_durch%!
)
)
)
endlocal
endlocal
Steffen