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

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

Frage Entwicklung Batch & Shell

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

03.10.2011, aktualisiert 18.10.2012, 5506 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
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
01.
 robocopy "%Quelle%\Boot" "%Ziehl%\boot" /MIR 
habe ich noch Schwierigkeiten sie in einer FOR-Schleife umzubauen. Ich zeige hier eine hoffnungsvolle Variante von meinen vielen Versuche:

01.
PushD "%~dp0" 
02.
for /f "usebackq tokens=1 delims=;" %%d in (Liste.txt) do set ErsteSpalte=%%d & for /f "usebackq tokens=2 delims=;" %%e in (Liste.txt) do (robocopy "%ErsteSpalte%" "%%e" /MIR) 
03.
PopD
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

01.
PushD "%~dp0" 
02.
for /f "usebackq tokens=2 delims=;" %%e in ('for /f "usebackq tokens=1 delims=;" %%d in (Liste.txt) do set ErsteSpalte=%%d') do robocopy "%ErsteSpalte%" "%%e" /MIR 
03.
PopD
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:
01.
for /f "usebackq tokens=1,2 delims=;" %%A in ("Liste.txt") do ( 
02.
    REM Erste Anweisung 
03.
    REM Zweite Anweisung 
04.
)
...Oder, wenns komplexere Anweisungen sind (für manche ist es auch einfach übersichtlicher):
01.
for /f "usebackq tokens=1,2 delims=;" %%A in ("Liste.txt") do call :Sub "%%A" "%%B" 
02.
goto :eof 
03.
 
04.
:Sub 
05.
robocopy "%~1" "%~2" /MIR 
06.
REM ... 
07.
goto :eof
Mit freundlichen Grüßen,
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
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

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 ...

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 , aber wieso funktioniert das mit den :: eigentlich nicht? Hab ich da eine (andere) Programmiersprache hineingemischt?

Mit freundlichen Grüßen,
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 ...

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 :
01.
(  
02.
    REM Erste Anweisung  
03.
    REM Zweite Anweisung  
04.
)
wie folgt ausfüllen:
01.
02.
for /f "usebackq tokens=1,2 delims=;" %%A in ("Liste.txt") do 
03.
for /f "usebackq tokens=2,3 delims=;" %%A in ("Liste.txt") do echo  %%A 
04.
)
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
01.
 ...... do call :Sub "%~1" "%~2"
folgendes
01.
 ...... do call :Sub "%%A" "%%B"
verwendet wird, und warum anstatt ebenso wie in der davor stehenden Befehlszeile
01.
 :Sub 
02.
 <Befehl> "%%A" "%%B"
folgendes
01.
 :Sub 
02.
*<Befehl> "%~1" "%~2"
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
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 ...
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
call :Sub "%%A" "%%B"
und Übernahme der Inhalte von "%%A" und "%%B" als "%1" und "%2"
01.
:Sub 
02.
echo %1 %2 
03.
echo %~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:
01.
for /f "tokens=2 delims={}" %%i in ('bcdedit /store %Ziehl%\boot\bcd /create /d "%BootEintrag%" /application osloader') do set GUID={%%i} 
02.
bcdedit /store %Ziehl%\boot\bcd /set %GUID% device "ramdisk=[boot]\%HauptOrdner2%\sources\boot.wim,{ramdiskoptions}"
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 ...

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":
01.
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
Durch die Verwendung zusätzlicher "tokens" und "delims" (für die Zeilennummer werden die dargestellten Werte 1. Token und Trennzeichen ":" - vgl die Ausgabe von
findstr /n "^" "Text1.txt"
- 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
01.
@echo off 
02.
REM Die Zeile ist nur da, damit man nur die set p Frage sieht und nicht alles. Erst einfügen wenn alles funktioniert 
03.
:Error 
04.
set /p Source="Sollen die Daten aus einer ^(D^)atei eingelesen werden oder werden sie ^(m^)anuell eingegeben? " 
05.
if /i "%Source%"=="D" ( 
06.
REM For Schleife zum Abarbeiten der Datei mit [call :Sub "%%A" "%%B"] oder so 
07.
goto :eof 
08.
09.
if /i "%Source%"=="M" ( 
10.
REM Werte abfragen 
11.
REM Call :Sub "Wert1" "Wert2" 
12.
goto :eof 
13.
14.
goto :Error 
15.
 
16.
:Sub 
17.
REM Meister Bastlas Code, vielleicht abgewandelt 
18.
REM Hier sind die Übergebenen Werte als Parameter zu behandeln 
19.
goto :eof
Mit freundlichen Grüßen,
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
goto :eof
ä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:
if /i "%Source%" neq "M" goto :Error
- 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

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...

Mit freundlichen Grüßen,
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 ]
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 ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Ungewöhnliche Txt.Datei-Abfrage mit Batch (3)

Frage von DaTobsn zum Thema Batch & Shell ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...