Per Batch Zeilenweise aus einer Datei lesen - bei jedem Aufruf wird die nächste Zeile verwendet
und wenn Ende erreicht, soll wieder bei der ersten zeile begonnen werden
Hallo,
ich bräuchte mal wieder eure Hilfe bei der Erstellung einer Batch.
Und zwar geht es um folgendes.
Ich habe eine Datei, die pro Zeile einen Wert enthält.
z.B.
Hans
Peter
Gerda
...
Uwe
Ich möchte nun den jeweiligen Wert (also eine Zeile) auslesen und in einer Variablen verwenden.
Das könnte man ja mit
FOR %%f IN (datei.txt) DO echo %%f
welches hier Auslesen einzlner Zeilen aus einem TXT File mittels Batch beschrieben ist, bewerkstelligen.
Allerdings möchte ich nicht die einzelnen Werte am Stück auslesen.
Ich möchte, dass beim ersten Aufruf der Batch der Wert "Hans" ausgelesen und in eine Variable geschrieben wird. Beim zweiten Aufruf möchte ich den Wert "Peter" auslesen, usw.
Hinzu soll noch die Möglichkeit kommen, dass wenn man bei dem letzten Wert ist (in diesem Beispiel "Uwe"), dann soll die Batch beim nächsten Aufruf wieder beim ersten Wert "Hans" beginnen.
Es wäre schön, wenn man nicht irgendwo definieren muss, wieviele Zeilen die Datei hat, sondern wenn bei Erreichen des Endes automatisch wieder bei der 1. Zeile begonnen wird.
Wiegesagt wer hat hier eine Idee für mich, wie ich das hinbekommen kann.
Viele Grüße
Martin
Hallo,
ich bräuchte mal wieder eure Hilfe bei der Erstellung einer Batch.
Und zwar geht es um folgendes.
Ich habe eine Datei, die pro Zeile einen Wert enthält.
z.B.
Hans
Peter
Gerda
...
Uwe
Ich möchte nun den jeweiligen Wert (also eine Zeile) auslesen und in einer Variablen verwenden.
Das könnte man ja mit
FOR %%f IN (datei.txt) DO echo %%f
welches hier Auslesen einzlner Zeilen aus einem TXT File mittels Batch beschrieben ist, bewerkstelligen.
Allerdings möchte ich nicht die einzelnen Werte am Stück auslesen.
Ich möchte, dass beim ersten Aufruf der Batch der Wert "Hans" ausgelesen und in eine Variable geschrieben wird. Beim zweiten Aufruf möchte ich den Wert "Peter" auslesen, usw.
Hinzu soll noch die Möglichkeit kommen, dass wenn man bei dem letzten Wert ist (in diesem Beispiel "Uwe"), dann soll die Batch beim nächsten Aufruf wieder beim ersten Wert "Hans" beginnen.
Es wäre schön, wenn man nicht irgendwo definieren muss, wieviele Zeilen die Datei hat, sondern wenn bei Erreichen des Endes automatisch wieder bei der 1. Zeile begonnen wird.
Wiegesagt wer hat hier eine Idee für mich, wie ich das hinbekommen kann.
Viele Grüße
Martin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 75780
Url: https://administrator.de/forum/per-batch-zeilenweise-aus-einer-datei-lesen-bei-jedem-aufruf-wird-die-naechste-zeile-verwendet-75780.html
Ausgedruckt am: 15.04.2025 um 19:04 Uhr
17 Kommentare
Neuester Kommentar

Ohne externe Definition, sei es über die Registry, eine Datei oder das Systemenvironment geht das nicht, was du vorhast. Für das Setzen einer nichtflüchtigen Variablen benötigst du setx.exe aus den XP-Support-Tools.
Hellsehen kann auch das fortschrittlichste Betriebssystem (noch) nicht.
Hellsehen kann auch das fortschrittlichste Betriebssystem (noch) nicht.

Du musst die Anzahl der bereits ausgelesenen Zeilen ermitteln, den Wert in eine Variable oder Datei schreiben. Anhand dieser Variablen kannst du dann mit SKIP die gelesenen Zeilen übergehen. Wenn du alle geSKIPPED hast, ist die Variable doch leer, dann beginnst du halt von vorn.
Beenden/Abbrechen kannst du den Spaß mit goto :EOF
Beenden/Abbrechen kannst du den Spaß mit goto :EOF

Wie skip funktioniert, steht in der Hilfe zu FOR, damit werden einfach n Zeilen übersprungen. Mit goto :eof beendest du nach skip und dem nachfolgen Lesen der nächsten Zeile (wenn eine da ist) den Ablauf. Wenn keine mehr da ist, dürfte die variable leer sein.
Ein fertiges Beispiel kannst du von mir nicht bekommen, nur Anregungen.
Nach meiner festen Überzeugung lernt man nur so den Umgang mit Batch-Scripten, und nur so bleibt auch was hängen.
Ein fertiges Beispiel kannst du von mir nicht bekommen, nur Anregungen.
Nach meiner festen Überzeugung lernt man nur so den Umgang mit Batch-Scripten, und nur so bleibt auch was hängen.

EOF ist das Dateiende der Batchdatei, das hat mit FOR wenig bis nichts zu tun. 
Hier gibt es jede Menge Beispiele im Unterforum, etwas, aus dem du Teile entnehmen kannst, die auch erläutert sind, ist sicher dabei.
Hier gibt es jede Menge Beispiele im Unterforum, etwas, aus dem du Teile entnehmen kannst, die auch erläutert sind, ist sicher dabei.

Als erst mal musst du die Rows so speichern, dass sie nach dem Beenden auch noch zur Verfügung stehen, dazu solltest du setx.com (Support-Tools) benutzen. Die normalen Variablen sind nämlich beim Schließen des Konsolenfensters weg.
2 %% für Schleifenvariablen innerhalb der Batch, wenn du das direkt testest, darf die Schleifenvariable nur 1 % enthalten.
Nicht geprüft, ausprobieren musst du selbst.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
if "%rows%=="" setx rows 0
set rows1=%rows%
set irgendwas=
FOR /F "skip=%rows1%" %%i IN (datei.txt) DO call :tuwas %%i
goto :eof
:tuwas
rem den ausgelesenen Namen sichern
if "%1"=="" set rows=0 & setx rows 0 & goto :eof
set irgendwas=%1
set /a rows1=+1
setx rows %rows1%
2 %% für Schleifenvariablen innerhalb der Batch, wenn du das direkt testest, darf die Schleifenvariable nur 1 % enthalten.
Nicht geprüft, ausprobieren musst du selbst.

Ich will erst mal ein paar kleine Fehler beseitigen, das fertige Script bekommst du nicht, nur noch Tipps. So, wie der Code da steht, funktioniert er nicht 
Beenden kannst du, wenn du am Ende des Calls, also als letzte Zeile exit eingibts.
Bei den Zeilen mit setx muss hinten noch ein -m ran, rows mit 0 geht nicht, dafür muss "" eingesetzt werden und wenn rows ="" ist, funktioniert die FOR-Schleife mit dem skip-Befehl nicht. Dann gutes Gelingen und fröhliche Bastelns. Kleiner Tipp noch: Du musst 2 bzw. 3 weitere Sprungmarken verwenden.
Beenden kannst du, wenn du am Ende des Calls, also als letzte Zeile exit eingibts.
Bei den Zeilen mit setx muss hinten noch ein -m ran, rows mit 0 geht nicht, dafür muss "" eingesetzt werden und wenn rows ="" ist, funktioniert die FOR-Schleife mit dem skip-Befehl nicht. Dann gutes Gelingen und fröhliche Bastelns. Kleiner Tipp noch: Du musst 2 bzw. 3 weitere Sprungmarken verwenden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off & setlocal
if not "%rows%=="" set rows1=%rows%
set irgendwas=
FOR /F "skip=%rows1%" %%i IN (datei.txt) DO call :tuwas %%i
goto :eof
:tuwas
rem den ausgelesenen Namen sichern
if "%1"=="" set rows= & setx rows "" -m & goto :eof
set irgendwas=%1
set /a rows1=+1
setx rows %rows1% -m
echo %irgendwas%
echo %rows1%
pause
exit

Ein call eine Unterroutine ist das Gleiche, als wenn man eine externe Batch aufruft. Du musst die Unterroutine mit goto :eof beenden; die externe Bätch würde sich selbst beenden, wenn der Ablauf beendet ist. D. h. nach :tuwas und vor :tuwasanderes gehört ein goto :eof.
Ich will mal nicht so sein, sonst quälst du dich noch in Wochen.
Hier der funktionierende Code:
Die Batch-Datei muss immer separat aufgerufen werden, nicht aus einem geöffneten Konsolenfenster, sonst funktioniert sie nicht. Wenn du das nicht willst, musst du die Variable ROWS in eine Datei oder in die Registry schreiben und damit verarbeiten.
Ich will mal nicht so sein, sonst quälst du dich noch in Wochen.
Hier der funktionierende Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@echo off & setlocal
set rows1=
set irgendwas=
if not "%rows%"=="" goto :nichtleer
:start
set parm="delims="
set rows1=0
goto :weiter
FOR /F %parm% %%i IN (datei.txt) DO call :tuwas %%i
goto :eof
:nichtleer
set rows1=%rows%
set parm="skip=%rows%"
:weiter
FOR /F %parm% %%i IN (datei.txt) DO call :tuwas %%i
goto :start
:tuwas
rem den ausgelesenen Namen sichern
if "%1"=="" set rows= & setx rows ""-m & goto :eof
set irgendwas=%1
set /a rows1=rows1+1
setx rows %rows1% -m
echo %irgendwas%
rem echo %rows1%
pause
exit
Die Batch-Datei muss immer separat aufgerufen werden, nicht aus einem geöffneten Konsolenfenster, sonst funktioniert sie nicht. Wenn du das nicht willst, musst du die Variable ROWS in eine Datei oder in die Registry schreiben und damit verarbeiten.

Ganz gegen meine Einstellung habe ich dir doch eine fertige Lösung präsentiert, dein Problemchen wäre damit gelöst.
Ohne dir zu nahe treten zu wollen, aber ich bin kein Ersatz für einen Programmierkurs.
Lass mich da bitte raus. Du wirst das schon schaffen: Üben, üben, üben.
Ohne dir zu nahe treten zu wollen, aber ich bin kein Ersatz für einen Programmierkurs.