Schleife in Batch Datei
Hallo zusammen,
ich habe folgende Batchdatei:
@echo on & setlocal enabledelayedexpansion
set "Datei=D:\Batch\1.txt"
set "t=temp.tmp"
set "Suchen1=Diese Zeile soll ersetzt werden"
set "Ersetzen1=Diese Zeile wurde ersetzt"
if exist "%t%" del "%t%"
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine
copy "%t%" "%Datei%"
::move "%t%" "%Datei%"
goto :Weiter_im_Batch
:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"
if not defined L >>"%t%" echo\& goto :eof
set WriteLine1=!L:%Suchen1%=%Ersetzen1%!
:Weiter_im_Batch
Mein Problem ist nun Folgendes:
1. Die gewünschte Zeile wird ersetzt, aber zusätzlich wird die letzte Zeile in der text datei gelöscht.
2. Wie bekomme ich eine Schleife um alles, damit er nicht nur die Datei 1.txt ändert, sondern alle Dateien im entsprechenden Verzeichnis!
Gruß Zweehh
ich habe folgende Batchdatei:
@echo on & setlocal enabledelayedexpansion
set "Datei=D:\Batch\1.txt"
set "t=temp.tmp"
set "Suchen1=Diese Zeile soll ersetzt werden"
set "Ersetzen1=Diese Zeile wurde ersetzt"
if exist "%t%" del "%t%"
for /f "delims=" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine
copy "%t%" "%Datei%"
::move "%t%" "%Datei%"
goto :Weiter_im_Batch
:ProcessLine
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"
if not defined L >>"%t%" echo\& goto :eof
set WriteLine1=!L:%Suchen1%=%Ersetzen1%!
"%t%" echo !WriteLine1!
Mein Problem ist nun Folgendes:
1. Die gewünschte Zeile wird ersetzt, aber zusätzlich wird die letzte Zeile in der text datei gelöscht.
2. Wie bekomme ich eine Schleife um alles, damit er nicht nur die Datei 1.txt ändert, sondern alle Dateien im entsprechenden Verzeichnis!
Gruß Zweehh
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 131362
Url: https://administrator.de/forum/schleife-in-batch-datei-131362.html
Ausgedruckt am: 22.04.2025 um 11:04 Uhr
5 Kommentare
Neuester Kommentar
Moin Zweehh,
Du holst dir ja (vermeintlich) alle Zeilen der Datei %Datei% samt Zeilennummern mit [ for /f "delims=" %%i in ('findstr /n $ "%Datei%"') ].
Da du aber nur alle Zeilen "finden" willst, die ein $, ein erkennbares Zeilenende ==CRLF haben, liegt der Schluss nahe.
Umgehung: Suche nicht alle Zeilen mit einem Zeilenende (haben alle Zeilen mit CRLF), sondern nach allen Zeilen mit einem Zeilenanfang (=="^" beim FindStr-Aufruf).
Da das Caret wiederum unter der cmd.exe ein Sonderzeichen ist, musst du dieses Sonderzeichen "maskieren", d.h. entweder verdoppeln oder in Anführungszeichen setzen.
Beispiel am Cmd-Prompt:
Ändere das
Dann kannst du den vorhandenden Batch in einer "FOR %i in (dateien) do thebatsch.cmd %i" aufrufen.
Grüße
Biber
1. Die gewünschte Zeile wird ersetzt, aber zusätzlich wird die letzte Zeile in der text datei gelöscht.
Das erste Problem kann eigentlich nur darauf zurückzuführen sein, dass die letzte Zeile in deiner Textdatei nicht mit einem Zeilenumbruch (CRLF) endet.Du holst dir ja (vermeintlich) alle Zeilen der Datei %Datei% samt Zeilennummern mit [ for /f "delims=" %%i in ('findstr /n $ "%Datei%"') ].
Da du aber nur alle Zeilen "finden" willst, die ein $, ein erkennbares Zeilenende ==CRLF haben, liegt der Schluss nahe.
Umgehung: Suche nicht alle Zeilen mit einem Zeilenende (haben alle Zeilen mit CRLF), sondern nach allen Zeilen mit einem Zeilenanfang (=="^" beim FindStr-Aufruf).
Da das Caret wiederum unter der cmd.exe ein Sonderzeichen ist, musst du dieses Sonderzeichen "maskieren", d.h. entweder verdoppeln oder in Anführungszeichen setzen.
Beispiel am Cmd-Prompt:
>findstr /n ^^ werte.txt
1:Var1=568
2:Var2=WertVonVar2
3:Var3=Beaver was here
(=21:47:05 D:\temp=)
>findstr /n "^" werte.txt
1:Var1=568
2:Var2=WertVonVar2
3:Var3=Beaver was here
2. Wie bekomme ich eine Schleife um alles, damit er nicht nur die Datei 1.txt ändert, sondern alle Dateien im entsprechenden Verzeichnis!
Ändere das
set "Datei=D:\Batch\1.txt"
in ein...set "Datei=%~1"
...also von enem festen Dateiname auf "Parameter 1"Dann kannst du den vorhandenden Batch in einer "FOR %i in (dateien) do thebatsch.cmd %i" aufrufen.
Grüße
Biber
Moin zweehh,
Eine Möglichkeit wäre, da du ja in der Variablen %line% eine Zeile mit dem Aufbau
Ändere:
in neue Zeile
Dann würde die Variable %L% nur gefüllt werden in Zeilennummern kleiner gleich 30.
Sollte das nicht die erforderliche Performancesteigerung bringen (es werden nach wie vor ja alle x-tausend Zeilen durchgenudelt),
dann begibt dich mal auf die Suchmaschinenbefragung nach "head.exe" für Windows.
Das Kommando head ist eigentlich aus der Unix-Welt und zeigt die ersten x zeilen einer Textdatei.
Dieses Utilitiy ist auch schon von hunderten von C-Einsteigern und PraktikantInnen nach Windows portiert worden und sicherlich im Netz zu finden.
Grüße
Biber
Wie kann ich das ganze so anpassen, dass nur die ersten 30 Zeilen durchsucht werden?
Auch hier gäbe es wieder mehrere Strategien.Eine Möglichkeit wäre, da du ja in der Variablen %line% eine Zeile mit dem Aufbau
{zeilennummer}: zeileninhalt
...transportierst, einfach den Wert von {Zeilennummer} in der ersten FOR-Anweisung des Call-Blocks abzuprüfen.Ändere:
...
for /f "tokens=1* delims=:" %%a in ("%Line%") do set "L=%%b"
..
for /f "tokens=1* delims=:" %%a in ("%Line%") do IF %%a LEQ 30 set "L=%%b"
Sollte das nicht die erforderliche Performancesteigerung bringen (es werden nach wie vor ja alle x-tausend Zeilen durchgenudelt),
dann begibt dich mal auf die Suchmaschinenbefragung nach "head.exe" für Windows.
Das Kommando head ist eigentlich aus der Unix-Welt und zeigt die ersten x zeilen einer Textdatei.
Dieses Utilitiy ist auch schon von hunderten von C-Einsteigern und PraktikantInnen nach Windows portiert worden und sicherlich im Netz zu finden.
Grüße
Biber
Moin zweehh,
unter anderem ist eine Standalone-Head.exe in dem SourceForge-Paket Unix-CoreUtils.
Du brauchst aus diesem 5-MegaByte-Werkzeugkoffer nur die eine einzige Winz-Datei "head.exe".
Dann kannst du die ersten 30 Zeilen mit
Hilfe bei den von unix portierten Utilitys gibt es "head --help" statt "head /?".
Grüße
Biber
unter anderem ist eine Standalone-Head.exe in dem SourceForge-Paket Unix-CoreUtils.
Du brauchst aus diesem 5-MegaByte-Werkzeugkoffer nur die eine einzige Winz-Datei "head.exe".
Dann kannst du die ersten 30 Zeilen mit
head -n30 beispiel.txt.
...aus deiner Textatei rausflöhen - und nur noch mit diesen 30 Zeilen hantieren.Hilfe bei den von unix portierten Utilitys gibt es "head --help" statt "head /?".
Grüße
Biber