Die Eingabe aus der Zeile einer externen .txt-Datei lesen, Batch abarbeiten und die nächste Zeile lesen usw. bis alle Zeilen abgearbeitet wurden.
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 174078
Url: https://administrator.de/contentid/174078
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
18 Kommentare
Neuester Kommentar
moin evilben..
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
- 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
Hallo evinben!
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 "
Grüße
bastla
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
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 ((at)echo off oder batch4runaways part 0.0000001
[edit: Nach einem Hinweis von Bastla "::" durch "REM" ersetzt]
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:
for /f "usebackq tokens=1,2 delims=;" %%A in ("Liste.txt") do (
REM Erste Anweisung
REM Zweite Anweisung
)
for /f "usebackq tokens=1,2 delims=;" %%A in ("Liste.txt") do call :Sub "%%A" "%%B"
goto :eof
:Sub
robocopy "%~1" "%~2" /MIR
REM ...
goto :eof
MfG,
Mathe172
[edit: Was das Blitzschnelle Schliessen des Batch Fensters angeht, dazu hat Timo sogar schon etwas in einem Tipp geschrieben ((at)echo off oder batch4runaways part 0.0000001
[edit: Nach einem Hinweis von Bastla "::" durch "REM" ersetzt]
Servus
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
Gruß
Zitat von @mathe172:
[edit: Was das Blitzschnelle Schliessen des Batch Fensters angeht, dazu hat Timo sogar schon etwas in einem Tipp geschrieben
(
[edit: Was das Blitzschnelle Schliessen des Batch Fensters angeht, dazu hat Timo sogar schon etwas in einem Tipp geschrieben
(
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
Gruß
@mathe172
Getestet hast Du Dein erstes Code-Beispiel aber wohl nicht ...
... ansonsten hättest Du vermutlich "
Grüße
bastla
Getestet hast Du Dein erstes Code-Beispiel aber wohl nicht ...
... ansonsten hättest Du vermutlich "
::
" durch "rem
" ersetzt ... Grüße
bastla
@mathe172
Grüße
bastla
wieso funktioniert das mit den :: eigentlich nicht?
Da muss ich auch passen - ich wusste nur, dass ... Grüße
bastla
Hallo evinben!
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 "
Ein (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]
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 (kannst und solltest Du aber nachholen) sondern auch nicht sinnvoll - Du kannst mitfor /f "usebackq tokens=2,3 delims=;" %%A in ("Liste.txt") do echo %%A
for /f "usebackq tokens=1-3 delims=;" %%A in ("Liste.txt") do echo %%A_%%B_%%C
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 mitcall :Sub "%%A" "%%B"
:Sub
echo %1 %2
echo %~1 und %~2
Grüße
bastla
[Edit] Fehlendes "~" in Zeile 3 ergänzt [/Edit]
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
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":
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "Text1.txt"') do for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "Text2.txt"^|findstr /b "%%i:"') do echo %%j_%%b
findstr /n "^" "Text1.txt"
Grüße
bastla
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
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
@echo off
REM Die Zeile ist nur da, damit man nur die set p Frage sieht und nicht alles. Erst einfügen wenn alles funktioniert
:Error
set /p Source="Sollen die Daten aus einer ^(D^)atei eingelesen werden oder werden sie ^(m^)anuell eingegeben? "
if /i "%Source%"=="D" (
REM For Schleife zum Abarbeiten der Datei mit [call :Sub "%%A" "%%B"] oder so
goto :eof
)
if /i "%Source%"=="M" (
REM Werte abfragen
REM Call :Sub "Wert1" "Wert2"
goto :eof
)
goto :Error
:Sub
REM Meister Bastlas Code, vielleicht abgewandelt
REM Hier sind die Übergebenen Werte als Parameter zu behandeln
goto :eof
MfG,
Mathe172
@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
... 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
goto :eof
Falls tatsächlich noch die Überprüfung auf "M" gewünscht wäre, würde ich denSprung vorziehen und Zeile 9 so formulieren:
if /i "%Source%" neq "M" goto :Error
Grüße
bastla
@bastla
Stimmt natürlich, wie immer, das hab ich nicht so genau bedacht
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
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 ]
Stimmt natürlich, wie immer, das hab ich nicht so genau bedacht
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
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 ]