Die Eingabe aus der Zeile einer externen .txt-Datei lesen, Batch abarbeiten und die nächste Zeile lesen usw. bis alle Zeilen abgearbeitet wurden.

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

03.10.2011, aktualisiert 18.10.2012, 5944 Aufrufe, 18 Kommentare

Hallo,
Ich beabsichtige eine Batch-Datei mit einer externen .txt-Datei zu steuern, in der folgende zwei Parameter (Beschreibung und der Name des Ordners, abgetrennt von einander mit Semikolon) auf mehreren Zeilen stehen:

Heute;DringendeAufgaben
Diese Woche;Aufgaben
Nächste Woche;Niedrige Priorität
usw.
usw.
...

Die Batch funktioniert soweit bei manueller Angabe: Nach dem Ausführen erscheinen nacheinander zwei „set /p“-Eingabeaufforderungen und die obigen beiden Werte aus einer Zeile werden jeweils einzeln eingegeben. Diese beiden Werte werden intern in der Batch-Datei als Variablen von verschiedenen Befehlszeilen verarbeitet.
Wie kann ich anstatt mit der bisherigen manueller Eingabe das neue Vorhaben so automatisieren, dass zuerst nur die erste Zeile gelesen wird und wenn die Batch fertig ist dann wieder zum Anfang gehen und die zweite Zeile aus der externen .txt-Datei lesen und so weiter? Also eigentlich genauso, wie es bei der manuellen Eingabe bisher funktioniert, aber mit dem wesentlichen Unterschied, dass die Eingabewerte von einer Liste gelesen werden sollen und die Batch soll natürlich erst dann aufhören, wenn alle Sätze in der .txt-Datei abgearbeitet wurden.
Alle Befehlszeilen mit einer FOR-Schleife umzustrukturieren wäre es für mich ein großer Aufwand, da es gründliche Veränderung der Batch-Datei voraussetzt. Ich habe es sogar versucht und aufgegeben, da es meine Kenntnisse mit der Verkettung von FOR-Befehle so dermaßen sprengt, dass ich es fast aufgegeben habe.

Danke sehr
Mitglied: 60730
60730 (Level 5)
03.10.2011 um 23:53 Uhr
moin evilben..

  • wie weit bist du denn schon mit der Briemlerschen Bauanleitung aus dem B Bereich?

Ich habe es sogar versucht und aufgegeben, da es meine Kenntnisse mit der Verkettung von FOR-Befehle so dermaßen sprengt, dass ich es fast aufgegeben habe.

Zu dem Thema gibt es ja hier auch fast nix, der Bastla schreibt ja genausowenig Schleifen wie Biber, Bietsch, Bubberman oder Briemler.
Ps: "Leider" ist mir beim scrollen das Trackpad verrutscht, der eine + Anspruchsvolle war ich, obwohl es zum jetzigen Zeitpunkt sehr unanspruchsvoll ist.

N8
Bitte warten ..
Mitglied: evinben
04.10.2011 um 06:38 Uhr
Hallo TimoBeil,

nehmen wir an ich muss tatsächlich die betroffene Batch-Datei gründlich umstrukturieren. Mit so einer Befehlszeile, wie diese
habe ich noch Schwierigkeiten sie in einer FOR-Schleife umzubauen. Ich zeige hier eine hoffnungsvolle Variante von meinen vielen Versuche:

So funktioniert es aber leider nicht.

Bei anderen Befehlszeilen, ähnlich wie oben, muss ich wiederum aus der Ausgaben der ersten FOR-Schleife einen bestimmten Token an die zweiten FOR-Schleife weiterreichen. Wie soll nun dies umgesetzt werden? Meine Versuche, wie hier

führen nur dazu, dass der Bach-Fenster sich blitzschnell schließt, ohne eine Fehlermeldung lesen zu können. Es ist echt zum Verzweifeln.

Es geht hier natürlich nicht nur um das Tool ROBOCOPY, sondern generell um das Prinzip. Dann kann ich zumindest anfangen und Schritt für Schritt alle betroffenen Befehlszeilen in "FOR-Schleifen" abzuändern.

Ich bin nach einer Woche mit der Batch endlich so weit fast fertig geworden und nun stelle ich fest, dass diese anders sei sollte, da die Eingabewerte viel einfacher aus einer txt-Datei eingelesen werden können. Nach einer Abfrage kann ich dann entscheiden, ob ich die Werte lieber manuell eingebe oder lieber aus einer externen txt-Datei einlesen lasse. Ich bin jedenfalls bereit zu lernen und werde, wenn es sein muss die Batch-Datei auf dem Kopf stellen und dort alles-alles ändern.

edit: obocopy=robocopy
Bitte warten ..
Mitglied: bastla
04.10.2011 um 07:20 Uhr
Hallo evinben!

Friemlers Tutorial zur FOR-Schleife ist ja nun wirklich nicht so gut versteckt ...

... anyhow: Wenn Du einfach darauf verzichtest, eigene Variablen für die Übergabe an "robocopy" zu verwenden und jene aus der Schleife nimmst (also auch "%%d"), sowie die Möglichkeit nutzt, mit zB "tokens=1-2" beide relevanten Werte in der gleichen Schleife auszulesen, solltest Du das schaffen ...

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
04.10.2011 um 10:32 Uhr
Hallo,

vielleicht noch eine kleine Ergänzung zu den Beiträgen von Timo und Bastla:
Mehrzeilige Anweisungen in For-Schleifen (also alles in einer Schleife, und nicht wie du es, wenn ich das richtig interpretiere, machen wolltest) lassen sich so machen:
...Oder, wenns komplexere Anweisungen sind (für manche ist es auch einfach übersichtlicher):
MfG,
Mathe172
[edit: Was das Blitzschnelle Schliessen des Batch Fensters angeht, dazu hat Timo sogar schon etwas in einem Tipp geschrieben (Irgendwo hier in der Mitte)]
[edit: Nach einem Hinweis von Bastla "::" durch "REM" ersetzt]
Bitte warten ..
Mitglied: 60730
60730 (Level 5)
04.10.2011, aktualisiert 18.10.2012
Servus
Zitat von @mathe172:
[edit: Was das Blitzschnelle Schliessen des Batch Fensters angeht, dazu hat Timo sogar schon etwas in einem Tipp geschrieben
(Irgendwo hier

Ich hab mal einen TOC dazugemalt, jetzt muß der geneigte Tester nicht mehr den ganzen Text lesen - würde aber auch nichts schaden.
Ich muß den genannten Tipp eh mal aufhybschen. Aber danke für den Denkanstoss ;-) face-wink

Gruß
Bitte warten ..
Mitglied: bastla
04.10.2011 um 13:05 Uhr
@mathe172

Getestet hast Du Dein erstes Code-Beispiel aber wohl nicht ...

... ansonsten hättest Du vermutlich "::" durch "rem" ersetzt ... ;-) face-wink

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
04.10.2011 um 20:50 Uhr
Hallo,

Getestet hast Du Dein erstes Code-Beispiel aber wohl nicht ...
nein, hab ich nicht :-) face-smile, aber wieso funktioniert das mit den :: eigentlich nicht? Hab ich da eine (andere) Programmiersprache hineingemischt?

MfG,
Mathe172
Bitte warten ..
Mitglied: bastla
04.10.2011 um 21:37 Uhr
@mathe172
wieso funktioniert das mit den :: eigentlich nicht?
Da muss ich auch passen - ich wusste nur, dass ... ;-) face-wink

Grüße
bastla
Bitte warten ..
Mitglied: evinben
05.10.2011 um 07:39 Uhr
danke euch alle wieder ganz herzlich für die treue Hilfe ;).

Das mit dem :SUB Aufruf winde ich genial. Wieder heute tolles gelernt.

1. Wenn ich richtig verstanden kann ich den Bereich :
wie folgt ausfüllen:
2. Sind "%~1", "%~2", "%~3" usw. Variablen der Variablen der davor stehenden Befehlszeile? Ist deren Vorteil zu den alphabetischen Variablen (%%a, %%b, %%c, usw.), mit denen ebenso eine exakte Sortierung analog zu den numerischen erreicht wird, nur eine Erleichterung was das Zählen betrifft?
Es muss ja ein Grund geben, warum anstatt
folgendes
verwendet wird, und warum anstatt ebenso wie in der davor stehenden Befehlszeile
folgendes
verwendet wird.

Am Mittwoch sollte die Arbeitskurve die höchste sein... Einen frischen Tag euch allen
Bitte warten ..
Mitglied: bastla
05.10.2011 um 08:06 Uhr
Hallo evinben!
for /f "usebackq tokens=1,2 delims=;" %%A in ("Liste.txt") do
for /f "usebackq tokens=2,3 delims=;" %%A in ("Liste.txt") do echo %%A
ist nicht nur nicht als Code formatiert (kannst und solltest Du aber nachholen) sondern auch nicht sinnvoll - Du kannst mit
gleich alle 3 benötigten Werte am Stück auslesen und weiter verarbeiten ...
Kurz zu "%%A" vs "%1" (oder "%%~A" vs "%~1" = ohne ev umgebende Anführungszeichen):

In einer "for"-Schleife werden als Schleifenvariablen Buchstaben (ab dem ersten angegebenen - siehe oben: token1 = %%A, token2 = %%B, ...) verwendet.

Ein (mit "call" aufgerufenes) Unterprogramm verhält sich im Prinzip wie ein weiterer Batch und nimmt die beim Aufruf als Parameter übergebenen Werte als "%1" bis max "%9" an - daher Aufruf mit
und Übernahme der Inhalte von "%%A" und "%%B" als "%1" und "%2"
wobei in der ersten Ausgabe die Anführungszeichen an Anfang und Ende des Parameters erhalten und im zweiten Fall entfernt werden.

Grüße
bastla

[Edit] Fehlendes "~" in Zeile 3 ergänzt [/Edit]
Bitte warten ..
Mitglied: evinben
05.10.2011 um 17:38 Uhr
alles ist nun klar Bastla!
Mit der Formatierung ist es kein Problem - ich ging davon aus, dass bei abgekürzten Angaben für den Leser es so - wie es war - übersichtlicher wäre. Ab nun werde ich alles formatieren, wenn die Regeln es verlangen.

ist nicht nur nicht als Code formatiert (kannst und solltest Du aber nachholen) sondern auch nicht sinnvoll - Du kannst mit
for /f "usebackq tokens=1-3 delims=;" %%A in ("Liste.txt") do echo %%A_%%B_%%C
gleich alle 3 benötigten Werte am Stück auslesen und weiter verarbeiten ...

Nein, kann ich so nicht. Es geht um solche Befehlszeilen:
Beim Ausführen der Batch werde ich nun nach der großen Batch- Umstrukturierung gefragt, ob die Infos manuell eingegeben oder lieber aus einer txt-Datei eingelesen werden sollen. Nun sollen die folgende Zeilen, wie die nachfolgenden beiden hier, geändert werden:
In der txt.Datei1 ist jeder GUID in ihrer Reihenfolge nach auf jeder Zeile zu finden. Damit die Werte aus den externen .txt-Dateien synchron eingelesen werden können, soll die Aufgabe jeweils auf einer Befehlszeile gepackt werden: die erste Befehlszeile muss den 2. Token (für Variable %BootEintrag%) aus der .txt-Datei2 einlesen; die zweite Befehlszeile muss nun von der .txt-Datei1 den 1. Token (für Variable %GUID%), und aus der txt-Datei2 den 1. Token (für Variable %HauptOrdner2%) einlesen.

Folgendes beinhaltet die txt-Datei2 (Beschreibung;Name des Haupt-Ordners):

Setup Windows Vista x32;Vista_x32
Setup Windows Vista SP1 x32;VistaSP1_x32
Setup Windows 7 SP1 x32;Win7SP1_x32
... usw.

Mein Kopf bricht bald zusammen, da ich nicht schaffe die beiden Befehlszeilen so umzuändern, dass die Werte aus den beiden externen .txt-Dateien synchron verarbeitet werden können.

Ich brauche etwas Pause, da ich mit %Null-Batch-Ahnung% in der letzten zwei Wochen für mich etwas zu heftige Batch geschrieben habe - d. h. es war für mich ein Crash-Kurs - jede Kleinigkeit kennenlernen, viele Lesen, und nicht nur kopieren und einfügen, sondern die Funktion verstehen, verdauen und probieren - probieren - probieren - probieren, sonst wäre ich überhaupt nicht vorwärts gekommen, bzw. hätte ich am liebsten hier im Forum in Echtzeit Fragen gestellt, die euch allen gelangweilt hätten.

Ich würde gerne die Batch posten, falls ihr nerven stabil seid - beruhigender weise funktioniert diese mit manueller Eingaben von zweier Werten. Für mich wäre natürlich das Wichtigste zu erfahren, wie so eine Aufgabe eigentlich korrekt zu lösen wäre, anstatt mit Code-Romanen.
Es wird somit ein Laufwerk für Multiboot vorbereitet.

Bis bald.
Bitte warten ..
Mitglied: bastla
05.10.2011 um 17:44 Uhr
Hallo ebinben!
Ab nun werde ich alles formatieren, wenn die Regeln es verlangen.
Danke - es tut vor allem den Augen gut ... ;-) face-wink

Grüße
bastla
Bitte warten ..
Mitglied: evinben
05.10.2011 um 18:48 Uhr
schön. Ich habe den Betrag etwas zu eilig fertig gestellt - nun habe ich ihn ergänzt.

GrußLa
Bitte warten ..
Mitglied: bastla
05.10.2011 um 19:27 Uhr
Hallo evinben!

Dass 2 Textdateien involviert sein sollen ist ja mal was Neues - wobei ich in Deinen beiden Codezeilen keine einzige Datei erwähnt finde ...

Wenn es keinen Schlüssel gibt, anhand dessen die korrespondierende Zeile aus der anderen Datei gelesen werden kann, geht das eigentlich nur über die Zeilennummer - schematisch anhand der Dateien "Text1.txt" und "Text2.txt":
Durch die Verwendung zusätzlicher "tokens" und "delims" (für die Zeilennummer werden die dargestellten Werte 1. Token und Trennzeichen ":" - vgl die Ausgabe von
- verwendet) können dann auch die jeweils benötigten Teile extrahiert werden.

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
05.10.2011 um 20:47 Uhr
Hallo,

was das "korrekte" Lösen einer solchen Aufgabe angeht, hat Bastla wahrscheinlich schon das (annähernd) Perfekte gepostet.

Vielleicht noch eine Anmerkung zur Dateneingabe:
Am einfachsten sollte es so in der Art gehen
MfG,
Mathe172
Bitte warten ..
Mitglied: bastla
05.10.2011 um 21:41 Uhr
@mathe172
... wobei ich auf die Zeilen 9 und 13 verzichten (wenn nicht Datei, dann eben manuell und gut ist - insbesondere auch ohne "delayedExpansion") und Zeile 14 auf
ändern würde ...

Falls tatsächlich noch die Überprüfung auf "M" gewünscht wäre, würde ich denSprung vorziehen und Zeile 9 so formulieren:
- Ergebnis: wieder keine "delayedExpansion" erforderlich ...

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
06.10.2011 um 00:27 Uhr
@bastla
Stimmt natürlich, wie immer, das hab ich nicht so genau bedacht :-) face-smile

Wobei sich natürlich die Frage stellt, ob es nicht sowieso einfacher ist, die Werte dann manuell abzufragen, wenn man keine Datei per Drag 'n Drop raufzieht. Damit hätte man einen Variablen Dateinamen und man könnte dem Benutzer eine Abfrage ersparen.
Ist aber sinnfrei, wenn die Datei nicht im selben Ordner ist ;-) face-wink

Aber was solche Fragen angeht, warten wir mal lieber auf den TO...

MfG,
Mathe172
[edit: Was DelayedExpansion in der Datei-Abfrage angeht, so fällt mir als einziger Grund für das Benötigen ein, dann man den Dateinamen abfragen will - wobei ich da dann Drag 'n Drop bevorzugen würde -->heisst also, Bastlas Vorschlag zeigt wieder mal den besten Weg :-) face-smile]
Bitte warten ..
Mitglied: evinben
06.10.2011 um 18:28 Uhr
danke euch wiedermal ganz herzlich. Es ist alles wie immer verständlich beschrieben/erklärt. Nun werden die angesprochenen Batch-Regelen in meinem Gehirn allmählich erleuchtet - es wird dankbar euch logischer und logischer. Ich brauche dennoch eine Pause - ein bisschen Sport und Ausgleich - und in zwei -drei Tagen dann wieder weiter.

Ich werde jedenfalls berichten. Sicherlich hat einer oder anderer das Interesse an so einem Multiboot-Projekt, an dem ich mehr aus Batch-Erfahrungsgründen als an dem Nutzen selbst, gearbeitet habe.

bis bald...
Bitte warten ..
Heiß diskutierte Inhalte
Windows 10
Windows 7 pro Lizenz nutzen für Windows 10
lukas0209Vor 1 TagFrageWindows 1016 Kommentare

Hallo Community, ich versuche seit einigen Wochen unser Netzwerk von Windows Server 2008 R2 Standard auf Windows Server 2016 Essentials um, welches eine städtische ...

Microsoft
Staatsanwaltschaften verschicken Vorladungen in Sachen Windows 10 Lizenzkeys
kgbornVor 1 TagInformationMicrosoft5 Kommentare

Nur zu Info für die Käufer der eBay-Schnäppchen - neuer Fall Staatsanwaltschaften verschicken Vorladungen in Sachen Windows 10 Lizenzkeys

Windows Netzwerk
Telefone im Netzwerk bekannt machen
jannik0205Vor 1 TagFrageWindows Netzwerk13 Kommentare

Hallo Zusammen, In unserem Unternehmen gibt es eine Telefonanlage mit eigenem Telefonienetz (192.168.5.X). Schließe ich ein Telefon an eine Netzwerkdose, bekommt es vom DHCP- ...

Microsoft
Microsoft Teams - "bitte wenden Sie sich an (. . .) um Teams für "domäne" zu aktivieren" nur bei einem Benutzer
eastfrisianVor 1 TagFrageMicrosoft6 Kommentare

Hallo zusammen! Wir haben bei uns Teams als Hybridversion eingeführt (Exchange on premise, AD-Sync in die Cloud) und nutzen Teams über das basic-Abonnement. Während ...

Netzwerke
Keine Versand von Mails von der Firmen zur Privaten E-Mailadresse möglich
blaub33r3Vor 1 TagFrageNetzwerke6 Kommentare

Hallo zusammen, wieso kommt der User keine Mails mehr? Der Sender wird als Spamer betrachtet? 1. Mailing an andere Privaten Adressen / Firmen Adressen ...

Netzwerke
Netzwerklaufwerk - Nur Lesen (Streamen)
CryexXVor 1 TagFrageNetzwerke8 Kommentare

Hallo, ich hab mal ne Frage und hoffe auf Lösung. Mir schießt aktuell keine in den Kopf :( Ich möchte ein Netzlaufwerk freigeben. Auf ...

Router & Routing
Vodafone Kabel: Eigenen Router an den Kabelanschluss oder einen WLAN-Router ohne Modem hinter die Vodafone Station?
DyingWordsVor 1 TagFrageRouter & Routing6 Kommentare

Hallo zusammen, da wir demnächst in eine Wohnung mit Kabelanschluss von Vodafone einziehen werden, frage ich mich, ob es sinnvoller ist einen eigenen Router ...

Linux
Knoppix 9.1 verfügbar
sabinesVor 1 TagInformationLinux6 Kommentare

Klaus Knopper hat eine neue Version zum Download bereitgestellt. Achtung in der Übersicht ist noch die Version 8.6.1 aus 2019 genannt, im Downloadverzeichnis ist ...