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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 175713
Url: https://administrator.de/contentid/175713
Ausgedruckt am: 08.11.2024 um 02:11 Uhr
7 Kommentare
Neuester Kommentar
Aloha,
da wäre ein von bastla gefuchster vbs-inliner sinnvoll zu nutzen:
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
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 ...
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 ...
@skye
Grüße
bastla
P.S.: Ein jeb-the-batcher-mäßiges
sieht viel lustiger aus als ein schnödes
allerdings das Wiedereinführen der Leerzeilen ist doch ein wenig Umständlich
Naja @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
bastla
P.S.: Ein jeb-the-batcher-mäßiges
(echo())>>"%t%"
(echo.))>>"%t%"
Das ganze läßt sich auch mit einer minimalen Änderung zum laufen bringen
Original, nur schöner formatiert
geänderter Code
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
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
@bastla
Genau das passiert natürlich immer wenn man den Kram nicht testet
An der Stelle reicht es die beiden Zeilen zu tauschen
Grüße
jeb
Genau das passiert natürlich immer wenn man den Kram nicht testet
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