zweehh
Goto Top

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%!
"%t%" echo !WriteLine1!
: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

Content-Key: 131362

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: Biber
Biber Dec 09, 2009 at 20:53:33 (UTC)
Goto Top
Moin Zweehh,

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
Member: zweehh
zweehh Dec 10, 2009 at 07:05:43 (UTC)
Goto Top
Moin Biber,

vielen Dank für die schnelle Hilfe. Klappt wie gewünscht.

Leider sind die Textdateien sehr lang und somit dauert die ganze Sache doch recht lang. Da der zu ersetzende Ausdruck aber immer in den ersten 30 Zeilen steht würde ich die Sache gern abkürzen.
Wie kann ich das ganze so anpassen, dass nur die ersten 30 Zeilen durchsucht werden?

Grüße
zweeHH
Member: Biber
Biber Dec 11, 2009 at 12:00:19 (UTC)
Goto Top
Moin zweehh,

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" 
in neue Zeile
..
for /f "tokens=1* delims=:" %%a in ("%Line%") do IF %%a  LEQ 30 set "L=%%b" 
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
Member: zweehh
zweehh Dec 14, 2009 at 14:31:16 (UTC)
Goto Top
Hallo Biber,

wie bereits vermutet liefert die erste Möglichkeit keine Performancesteigerung. Viel schlimmer noch ab Zeile 30 werden alles weiteren Zeilen gelöscht und durch den in Zeile 30 enthalten text ersetzt.

Leider muss ich zugeben, dass die Suche nach head.exe nicht mit Erfolg gekrönt war.
Vielleicht kannst du mir da noch mal auf die Sprünge helfen.

Gruß
ZweeHH
Member: Biber
Biber Dec 14, 2009 at 15:17:05 (UTC)
Goto Top
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
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