Top-Themen

Aktuelle Themen (A bis Z)

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, 4443 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 ..
Ähnliche Inhalte
Batch & Shell
Batch Schleife als FOR-SCHLEIFE
gelöst Frage von mp2711Batch & Shell2 Kommentare

Mit den FOR-Schleifen habe ich mich leider bislang zu selten auseinander gesetzt, aber da ich sonst gerade nicht weiter ...

Windows 7
Batch Datei erzeugt bei jedem Befehl Schleife
gelöst Frage von FrashdWindows 72 Kommentare

Moin, wir haben Windows 7 prof. in einer Domäne. Ich habe eine Batch Datei geschrieben, die die Netzlaufwerke verbindet ...

Batch & Shell
Verlinkung erstellen Batch Datei mit for Schleife
gelöst Frage von rusdavBatch & Shell2 Kommentare

Hallo, ich möchte aus einer CSV Datei Ordner und eine Verlinkung auf den zu erstellenden Ordner erstellen. Dazu habe ...

Batch & Shell
Batch-Skript Schleife älteste Datei umbenennen
Frage von pentaddBatch & Shell9 Kommentare

Hallo zusammen, Ich möchte per Batch-Skript folgendes umsetzen: älteste Datei in einem Ordner finden Datei umbenennen: vom Dateinamen die ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 106 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 2 TagenInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 2 TagenDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell20 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless8 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Router & Routing
Fritzbox Gastnetz - exposed Host - zur Sophos IPTV
Frage von medikopterRouter & Routing7 Kommentare

Hallo zusammen, ich habe eine Frage bezüglich des Fritz box Gastzugangs an einer Sophos UTM Home. An liebsten wäre ...