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-Key: 3678238451

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

Printed on: May 11, 2024 at 00:05 o'clock

Mitglied: 3479126418
3479126418 Aug 17, 2022 updated at 14:11:46 (UTC)
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.
Member: MarkusZieg
MarkusZieg Aug 17, 2022 updated at 15:19:14 (UTC)
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!
Member: MarkusZieg
MarkusZieg Aug 17, 2022 at 15:05:40 (UTC)
Goto Top
849a4f9e-96d4-4012-a6c2-c10af8bed714.
Mitglied: 3479126418
3479126418 Aug 17, 2022 updated at 15:35:20 (UTC)
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?🙉
Member: MarkusZieg
MarkusZieg Aug 17, 2022 updated at 15:37:51 (UTC)
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.
Mitglied: 3479126418
Solution 3479126418 Aug 17, 2022 updated at 16:02:22 (UTC)
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.
Member: rubberman
Solution rubberman Aug 17, 2022 updated at 17:44:02 (UTC)
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
Member: MarkusZieg
MarkusZieg Aug 17, 2022 at 16:28:38 (UTC)
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😄
Member: MarkusZieg
MarkusZieg Aug 17, 2022 at 16:43:17 (UTC)
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
Member: rubberman
rubberman Aug 17, 2022 at 17:45:47 (UTC)
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
Member: MarkusZieg
MarkusZieg Aug 17, 2022 at 18:15:08 (UTC)
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!