porteiner
Goto Top

Batch Ausrufezeichen beim suchen ersetzen nicht löschen

Hallo zusammen

Ich habe folgendes Problem. Ich möchte in einer Textdatei "Andeer" durch "Zillis" ersetzen. Unten ist der Code, den ich hier "Batch Datei zum Suchen und Ersetzen in einer Textdatei die ein ! enthält" gefunden habe.
Das ersetzen funktioniert auch.

Problem:
In der Textdatei hat es auch ! (Ausrufezeichen). Diese werden nach dem ausführen des Batches leider gelöscht. Leere Zeilen werden auch gelöscht. Gibt es eine Möglichkeit, wie ich das verhindern kann? Also das wirklich nur "Andeer" durch "Zillis" ersetzt wird und sonst nichts an der Text-Datei geändert wird?

set "Datei_Vorlage_Andeer=c:\Vorlage.txt"
set "Von=Andeer"
set "Nach=Zillis"
set "t=c:\Vorlage_neu.txt"
if exist "%t%" del "%t%"
for /f "usebackq delims=" %%i in ("%Datei_Vorlage_Andeer%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"

Besten Dank für Euere Hilfe
Gruss
porteiner

Content-Key: 175713

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

Printed on: April 23, 2024 at 18:04 o'clock

Member: Skyemugen
Skyemugen Nov 03, 2011 at 13:01:34 (UTC)
Goto Top
Aloha,

da wäre ein von bastla gefuchster vbs-inliner sinnvoll zu nutzen:
@echo off & setlocal
set "R=%temp%\ReplaceAll.vbs"  
if not exist "%R%" >"%R%" echo Set fso=CreateObject("Scripting.FileSystemObject"):Set a=WScript.Arguments:T=fso.OpenTextFile(a(0)).ReadAll:fso.CreateTextFile(a(0)).Write Replace(T,a(1),a(2))  

set "Datei=testdatei.txt"  
set "Alt=Andeer"  
set "Neu=Zillis"  
cscript //nologo "%R%" "%Datei%" "%Alt%" "%Neu%"  

Denn per batch wäre zwar noch einfach die Umsetzung ohne delayedexpansion (was dazu führt, dass Ausrufezeichen entfernt werden, da sie als Variablen interpretiert werden) per Unterprogramm und call, allerdings das Wiedereinführen der Leerzeilen ist doch ein wenig Umständlich (auch wenn wir das bereits alles hier mehrfach hatte...) wenn auch nicht unmöglich.

Hierbei gibt es auch keine neue Output-Datei, sondern die existierende wird dabei direkt umgearbeitet.

greetz André

P.S.: Wenn du nur in einer Textdatei ersetzen willst ... Texteditor deiner Wahl öffnen, Suchen/Ersetzen auswählen, Zeugs eintragen, durchführen, fertig ...
Member: bastla
bastla Nov 03, 2011, updated at Oct 18, 2012 at 16:48:59 (UTC)
Goto Top
@skye
allerdings das Wiedereinführen der Leerzeilen ist doch ein wenig Umständlich
Naja face-wink
@echo off & setlocal
set "Datei_Vorlage_Andeer=c:\Vorlage.txt"  
set "Von=Andeer"  
set "Nach=Zillis"  
set "t=c:\Vorlage_neu.txt"  

if exist "%t%" del "%t%"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei_Vorlage_Andeer%"') do set "Line=%%j" & call :ProcessLine  
goto :eof

:ProcessLine
setlocal enabledelayedexpansion
(if defined Line (echo !Line:%Von%=%Nach%!) else (echo())>>"%t%"  
endlocal
goto :eof
Grüße
bastla

P.S.: Ein jeb-the-batcher-mäßiges
(echo())>>"%t%"
sieht viel lustiger aus als ein schnödes
(echo.))>>"%t%"
face-wink
Member: Skyemugen
Skyemugen Nov 03, 2011 at 13:48:57 (UTC)
Goto Top
pfff ich hab' mich nur extra so ausgedrückt, um nicht nachdenken zu müssen, weil ich i.d.R. sowieso nie mit if defined arbeite und mir das darum eh nicht in den Sinn kommt ... den vbs-inliner hab' ich immer griffbereit ^__^
Member: jeb-the-batcher
jeb-the-batcher Nov 04, 2011 at 09:31:20 (UTC)
Goto Top
Das ganze läßt sich auch mit einer minimalen Änderung zum laufen bringen

Original, nur schöner formatiert
set "Datei_Vorlage_Andeer=c:\Vorlage.txt"  
set "Von=Andeer"  
set "Nach=Zillis"  
set "t=c:\Vorlage_neu.txt"  
if exist "%t%" del "%t%"  
setlocal EnableDelayedExpansion
for /f "usebackq delims=" %%i in ("%Datei_Vorlage_Andeer%") do (  
  set "Line=%%i"  
  set Line=!Line:%Von%=%Nach%!
  echo !Line!>>"%t%"  
)

geänderter Code
set "Datei_Vorlage_Andeer=c:\Vorlage.txt"  
set "Von=Andeer"  
set "Nach=Zillis"  
set "t=c:\Vorlage_neu.txt"  
if exist "%t%" del "%t%"  
setlocal DisableDelayedExpansion
(
  for /f "delims=" %%i in ('findstr /n "^" "%Datei_Vorlage_Andeer%"') do (  
    set "Line=%%i"  
    setlocal EnableDelayedExpansion
    set "Line=!Line:*:=!"  Löschen der Zeilennummer  
    set "Line=!Line:%Von%=%Nach%!"  
    (echo(!Line!)
    endlocal
  )
) > %t%

Wo ist der große Unterschied?
Zum kann es Leerzeilen bearbeiten, weil das findstr /n einfach vor jede Zeile die Zeilennummer packt in der Form 17:Meine Zeile

Im Gegensatz zu bastla setze ich delims lieber auf gar nichts, weil sonst werden bei Zeilen mit Doppelpunkten diese gleich mit entfernt,
aus "::Meine Zeile" wird dann einfach "Meine Zeile".

Um die Ausrufezeichen beizubehalten ist es nur wichtig die Expansion von %%i im Modus Disabled Delayed Expansion durchzuführen, danach kann man gefahrlos wieder DelayedExpansion aktivieren.

Dann entferne ich mit "set Line=!Line=*:=!" die Zeilennummer mit Doppelpunkt.

Den ganzen Block nochmal geklammert und dann den ganzen Block nach "> %t%" umleiten, spart das löschen und ist viel schneller.

jeb
Member: bastla
bastla Nov 04, 2011 at 14:08:48 (UTC)
Goto Top
@jeb
Bis auf die Tatsache, dass bei Deiner zweiten Version aus einer Leerzeile im Ergebnis
Andeer=Zillis
wird, ist das sicherlich die bessere Variante ... face-smile

Grüße
bastla

P.S.: Der Genauigkeit halber:
weil sonst werden bei Zeilen mit führenden Doppelpunkten diese gleich mit entfernt
Member: jeb-the-batcher
jeb-the-batcher Nov 05, 2011 at 09:10:37 (UTC)
Goto Top
@bastla

Genau das passiert natürlich immer wenn man den Kram nicht testet face-smile

An der Stelle reicht es die beiden Zeilen zu tauschen

    set "Line=!Line:%Von%=%Nach%!"   
    set "Line=!Line:*:=!"  Löschen der Zeilennummer   

Grüße
jeb
Member: porteiner
porteiner Nov 07, 2011 at 06:27:53 (UTC)
Goto Top
Hallo Zusammen

Besten Dank für die Hilfe, ich werde sie in einer ruhigen Minute testen und informieren, ob es bei mir auch funktioniert hat.
Gruss
poreiner