Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Schleife in Batch Datei

Frage Entwicklung Batch & Shell

Mitglied: zweehh

zweehh (Level 1) - Jetzt verbinden

09.12.2009 um 20:26 Uhr, 4398 Aufrufe, 5 Kommentare

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
Mitglied: Biber
09.12.2009 um 21:53 Uhr
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:
01.
>findstr /n ^^ werte.txt 
02.
1:Var1=568 
03.
2:Var2=WertVonVar2 
04.
3:Var3=Beaver was here 
05.
 
06.
(=21:47:05  D:\temp=) 
07.
>findstr /n "^" werte.txt 
08.
1:Var1=568 
09.
2:Var2=WertVonVar2 
10.
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
Bitte warten ..
Mitglied: zweehh
10.12.2009 um 08:05 Uhr
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
Bitte warten ..
Mitglied: Biber
11.12.2009 um 13:00 Uhr
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
Bitte warten ..
Mitglied: zweehh
14.12.2009 um 15:31 Uhr
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
Bitte warten ..
Mitglied: Biber
14.12.2009 um 16:17 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Ä in batch Datei (12)

Frage von BergEnte zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...