Probleme mit Leerzeilen und Tabs in suchen und ersetzen mit Batch
Hallo,
Ich heiße Mario und habe mich heute nach reichlicher Suche in eurem Forum mal angemeldet.
Folgendes ist mein Anliegen.
Ich möchte, beginnend von irgendeinem Verzeichnis aus durch selbiges, und rekursiv durch alle Unterverzeichnisse nach einer bestimmten Textdatei suchen.
In diesen soll dann ein Begriff gesucht und ersetzt werden.
Nach einigen Stunden Forumssuche und basteln bin ich zu folgendem Ergebnis gekommen. Erstmal danke, dass ich mittels Forum überhaupt dort hinkommen konnte.
Eigentlich klappt auch alles so wie ich es mir vorstelle nur (und das sind meine Probleme):
- Alle Leerzeilen gehen verloren
- In den Files kann es Leerzeilen mit Tabs geben. Überall, wo das der Fall ist steht dann folgende Zeile: ECHO ist ausgeschaltet (OFF).
Im falle der leerzeilen habe ich auch schon versucht folgendes mit in die FOR-Schleife einzubauen ....(if not defined !Line! >>%t% echo\)....
Dieses hat nur dazu geführt, dass nach jeder Zeile eine Leerzeile kam. Am zweiten Problem hat es nichts verändert.
Kann mir jemand weiterhelfen.
Ggf. würde ich das Script auch verwerfen, wichtig ist nur das Rekursive durchsuchen der Ordner und das anschließende ersetzen des Textes in den gefundenen Files.
Ich heiße Mario und habe mich heute nach reichlicher Suche in eurem Forum mal angemeldet.
Folgendes ist mein Anliegen.
Ich möchte, beginnend von irgendeinem Verzeichnis aus durch selbiges, und rekursiv durch alle Unterverzeichnisse nach einer bestimmten Textdatei suchen.
In diesen soll dann ein Begriff gesucht und ersetzt werden.
Nach einigen Stunden Forumssuche und basteln bin ich zu folgendem Ergebnis gekommen. Erstmal danke, dass ich mittels Forum überhaupt dort hinkommen konnte.
@echo off
setlocal enabledelayedexpansion
pushd .
cd /D s:\quellen\test
set "t=%temp%\temp.txt"
set "Von=WORKSPACE_A"
set "Nach=WORKSPACE"
for /R %%i in (CMakeLists.txt) do (
if exist %%i ((if exist "%t%" del "%t%") & (for /f "usebackq delims=" %%f in ("%%i") do set "Line=%%f" & >>"%t%" echo !Line:%Von%=%Nach%!)) & (move "%t%" "%%i" ) ))
popd
Eigentlich klappt auch alles so wie ich es mir vorstelle nur (und das sind meine Probleme):
- Alle Leerzeilen gehen verloren
- In den Files kann es Leerzeilen mit Tabs geben. Überall, wo das der Fall ist steht dann folgende Zeile: ECHO ist ausgeschaltet (OFF).
Im falle der leerzeilen habe ich auch schon versucht folgendes mit in die FOR-Schleife einzubauen ....(if not defined !Line! >>%t% echo\)....
Dieses hat nur dazu geführt, dass nach jeder Zeile eine Leerzeile kam. Am zweiten Problem hat es nichts verändert.
Kann mir jemand weiterhelfen.
Ggf. würde ich das Script auch verwerfen, wichtig ist nur das Rekursive durchsuchen der Ordner und das anschließende ersetzen des Textes in den gefundenen Files.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 136377
Url: https://administrator.de/contentid/136377
Ausgedruckt am: 19.11.2024 um 20:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo Mario_Steinberg und willkommen im Forum!
Versuch es damit:
Alternative: Für das Ersetzen ein wenig VBScript einbauen (wie zB hier) ...
Grüße
bastla
Versuch es damit:
@echo off & setlocal enabledelayedexpansion
set "Quelle=s:\quellen\test"
set "t=%temp%\temp.txt"
set "Von=WORKSPACE_A"
set "Nach=WORKSPACE"
for /f "delims=" %%i in ('dir /s /b "%Quelle%\CMakeLists.txt"') do (
del "%t%" 2>nul
for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%%i"') do (
set "Line=%%b"
if defined Line (call set "Line=%%Line:%Von%=%Nach%%%")
echo\!Line!>>"%t%"
)
move "%t%" "%%i"
)
Grüße
bastla
Jepp, genau so.
Von der Logik her würde es aber wahrscheinlich sinnvoller sein, das Vorhandensein von %Line% einmal zu prüfen.
Dafür gegebenenfalls lieber prüfen, ob es denn einen zweiten zu erstzenden Begriff gibt (falls das nicht auch jedes Mal der Fall ist).
Grüße
Biber
...
Von der Logik her würde es aber wahrscheinlich sinnvoller sein, das Vorhandensein von %Line% einmal zu prüfen.
Dafür gegebenenfalls lieber prüfen, ob es denn einen zweiten zu erstzenden Begriff gibt (falls das nicht auch jedes Mal der Fall ist).
.....
...
if defined Line (
REM Annahme 1: Ersetzung %von% in %Nach% gibt es "immer%
call set "Line=%%Line:%Von%=%Nach%%%"
REM Annahme 2: Manchmal (bei bestimmten Textdateien) auch eine zweite Ersetzung
if defined Von2 call set "Line=%%Line:%Von2%=%Nach2%%%"
)
...
Grüße
Biber
...
Moin Mario.Steinberg,
ja... würde gehen.... aber bedingt durch fehlende Datentypen wie Arrays im Batch nur mit sozusagen "geschachtelten" Variablen.
Lässt sich mit "Delayed Expansion"/verzögerter Variablenauflösung hinbekommen, aber massiv auf Kosten der Lesbarkeit und Wartbarkeit.
Bei Interesse an diesem Weg: irgendwann hatten wir mal hier im Forum so eine Frage "Arrays im Batch?" oder so ähnlich - müsste über die Suchfunktion zu finden sein.
Ich würde diesen Weg als dritte Wahl ansehen und zuerst prüfen,
Grüße
Biber
ja... würde gehen.... aber bedingt durch fehlende Datentypen wie Arrays im Batch nur mit sozusagen "geschachtelten" Variablen.
Lässt sich mit "Delayed Expansion"/verzögerter Variablenauflösung hinbekommen, aber massiv auf Kosten der Lesbarkeit und Wartbarkeit.
Bei Interesse an diesem Weg: irgendwann hatten wir mal hier im Forum so eine Frage "Arrays im Batch?" oder so ähnlich - müsste über die Suchfunktion zu finden sein.
Ich würde diesen Weg als dritte Wahl ansehen und zuerst prüfen,
- ob es nicht "wartbarer" mit einem 5maligen Copy&Paste und anpassen dieser Ersetz-Mir-Was-Zeile geht
- oder ob ich nicht alle "Von"/"Nach"-Kombinationen in eine zweite Text-Datei lege, die ich wiederum mit eine FOR/F-Anweisung abarbeite.
Grüße
Biber
Hallo Mario.Steinberg!
Falls es doch auch etwas (in einen Batch integriertes) VBS sein dürfte, könnte die "Sieben auf einen Streich"-Variante etwa so aussehen:
Zu jedem Begriff nach "Von" ist die Ersetzung (bei "Nach") anzugeben ...
Grüße
bastla
Falls es doch auch etwas (in einen Batch integriertes) VBS sein dürfte, könnte die "Sieben auf einen Streich"-Variante etwa so aussehen:
@echo off & setlocal
set "Quelle=s:\quellen\test"
set R=%temp%\ReplaceMulti.vbs
>%R% echo Von = Array( _
>>%R% echo "WORKSPACE_A", _
>>%R% echo "WORKSPACE_B", _
>>%R% echo "WORKSPACE_C", _
>>%R% echo "WORKSPACE_D", _
>>%R% echo "WORKSPACE_E", _
>>%R% echo "WORKSPACE_F", _
>>%R% echo "WORKSPACE_G" _
>>%R% echo )
>>%R% echo Nach = Array( _
>>%R% echo "WORKSPACE_ohneA", _
>>%R% echo "WORKSPACE_ohneB", _
>>%R% echo "WORKSPACE_ohneC", _
>>%R% echo "WORKSPACE_ohneD", _
>>%R% echo "WORKSPACE_ohneE", _
>>%R% echo "WORKSPACE_ohneF", _
>>%R% echo "WORKSPACE_ohneG" _
>>%R% echo )
>>%R% echo Set fso=CreateObject("Scripting.FileSystemObject")
>>%R% echo F=WScript.Arguments(0)
>>%R% echo T=fso.OpenTextFile(F).ReadAll:For i=0 To UBound(Von):T=Replace(T,Von(i),Nach(i)):Next
>>%R% echo fso.CreateTextFile(F).Write T
for /f "delims=" %%i in ('dir /s /b "%Quelle%\CMakeLists.txt"') do cscript //nologo %R% "%%i"
Grüße
bastla