markuszieg
Goto Top

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:

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

Content-ID: 3678238451

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

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

3479126418
3479126418 17.08.2022 aktualisiert um 16:11:46 Uhr
Goto Top
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. Mit
FINDSTR "^" "%quell_datei%"  
verarbeitest du auch Leerzeilen, weil das ^ (Regex Bedeutung "Start of line anchor") nur nach dem Zeilenanfang sucht, und den hat jede Zeile.
MarkusZieg
MarkusZieg 17.08.2022 aktualisiert um 17:19:14 Uhr
Goto Top
Ich hatte gerade schon die Hoffnung das es geht, aber nach einem kurzen Test funktioniert es immer noch nicht. Manche Absätze werden übernommen und manche verschwinden einfach. Ich werde mal ein Screenshot einstellen. Trotzdem schonmal vielen Dank!
MarkusZieg
MarkusZieg 17.08.2022 um 17:05:40 Uhr
Goto Top
849a4f9e-96d4-4012-a6c2-c10af8bed714.
3479126418
3479126418 17.08.2022 aktualisiert um 17:35:20 Uhr
Goto Top
Umleitungen in Dateien sollte man immer vor das echo schreiben denn sonst machen Nummern an den Zeilenenden Fehler wegen der Streams
:ers
SET "zeile=!zeile:%suchen_nach%=%ersetzen_durch%!"  
>>%ziel_datei% echo.!zeile!
GOTO :eof
Von Sonderzeichen will ich gar nicht erst anfangen.
Alder Schwede, wer macht Suchen und Ersetzen ehrlich produktiv in Programmcode noch mit Batch?? Lord Pomeroy?🙉
MarkusZieg
MarkusZieg 17.08.2022 aktualisiert um 17:37:51 Uhr
Goto Top
Keine Fragen zum Sinn dahinter face-smile (weis selber das es völlig beknackt ist face-sad ). Jeder sagt man soll so etwas in PowerShell machen, aber ich bin soweit gekommen....da wollte ich jetzt nicht aufgeben. Habe auch nur C++ und Java gelernt und frage mich langsam eh wer Spaß an Batch hat geschweige denn alles versteht. Blicke mit Müh und Not noch bei mir durch....

Es geht leider immer noch nicht. Mein aktueller Code lautet jetzt:

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%!"  
>>%ziel_datei% echo.!zeile!
::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
echo.
3479126418
Lösung 3479126418 17.08.2022 aktualisiert um 18:02:22 Uhr
Goto Top
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.
rubberman
Lösung rubberman 17.08.2022 aktualisiert um 19:44:02 Uhr
Goto Top
Ungetestet:
: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
Wenn's das nicht tut, schau mal per HEX Editor in die Datei, was du da als Zeilenumbruch siehst, wo es nicht funktioniert.

Steffen
MarkusZieg
MarkusZieg 17.08.2022 um 18:28:38 Uhr
Goto Top
@3479126418 Vielen Dank! Also die Absätze werden jetzt übernommen und alles geht. Der letzte Buchstabe wird jetzt aber abgeschnitten. Kein blassen Schimmer wieso, aber da kann ich ja vllt einfach ein Befehl einfügen, dass er ne geschweifte Klammer einfügen soll(die Zeile ist auch vorhanden nur die Klammer fehlt 😂👌

@rubberman Werde deinen Code jetzt auch mal testen und dann Bescheid geben ob bzw. was er macht. Auch dir schonmal vielen Dank.

Ihr rettet mir meinen Tag😄
MarkusZieg
MarkusZieg 17.08.2022 um 18:43:17 Uhr
Goto Top
@rubberman Der Code funktioniert und macht das was er soll, jedoch fügt er zum Teil wieder die Nachricht: "ECHO ist ausgeschaltet (OFF)" ein. Das hatte ich schonmal, also das sollte ich es in den Griff bekommen. Muss morgen aber erstmal in Ruhe auf der Arbeit durch den Code steigen da ja noch der Loop fehlt und so. Muss ich mal schauen was da die klügste Idee ist. Ich gebe zu der Code von @buddafish lächelt mich da natürlich an, da ich da nur immer eine } einfügen müsste. Aber wirklich riesiges Dank an euch Beide. Das hat mir wirklich geholfen und vllt findet sich ja noch der Fehler mit dem letzten Zeichen.

Wünsche einen schönen Abend

Markus
rubberman
rubberman 17.08.2022 um 19:45:47 Uhr
Goto Top
Du scheinst Zeilen zu haben die nur aus Leerzeichen und/oder Tabs bestehen.
Hab oben aktualisiert und aus
echo !zeile:%suchen_nach%=%ersetzen_durch%!
ein
echo(!zeile:%suchen_nach%=%ersetzen_durch%!
gemacht. Das sollte Abhilfe schaffen.

Steffen
MarkusZieg
MarkusZieg 17.08.2022 um 20:15:08 Uhr
Goto Top
Dann teste ich es nochmal und melde mich dann wenn ich es habe. Hatte nicht gedacht das ich am Ende zwei Lösungen hab😃 Danke!