Batch Batch Programmierung: txt einlesen und Variablen übergeben mit Subroutine

roy84

Newbie
Registriert
Nov. 2013
Beiträge
3
Hallo Allerseits

Ich programmiere zum ersten mal ein Batch-file und stehe vor einem Problem, welches ich auch nach Stunden noch nicht lösen konnte. (Ich bin kein Informatiker sondern lediglich Maschinenbauer, also vergebt mir meine Unbeholfenheit...)

Ich möchte ein Batch file programmieren, welches unter anderem ein txt-file einliest (readlist.bat). Dieses Batch-File möchte ich dann in einem anderen Batch-file mit "call" aufrufen können (hier: callreadlist.bat).
Was mir jetzt schon klar ist: Ich muss die Variablen im readlist.bat nicht lokal definieren, damit sie dem callreadlist.bat übergeben werden. Nur kriege ich das nicht hin...

Hier sind die files (die Dateiendungen müssen für die Batch-files noch angepasst werden):
Anhang anzeigen text.txt
Anhang anzeigen callreadlist.txt
Anhang anzeigen readlist.txt

Das Text.txt enthält lediglich "Test-Variablen".
Das readlist.bat sollte alle Zeilen spaltenweise einlesen (das klappt auch). Nur müssen die Variablen am Ende noch "nicht-lokal" gesetzt werden. Dafür habe ich mal probehalber folgende Zeilen eingefügt:

endlocal
set "job1fld=%job1fld%"
set "job1dat=%job1dat%"
set "job1kyw=%job1kyw%"
set "job2fld=%job2fld%"
set "job2dat=%job2dat%"
set "job2kyw=%job2kyw%"
set "job3fld=%job3fld%"
set "job3dat=%job3dat%"
set "job3kyw=%job3kyw%"
set vartest1=test1
set vartest2=test2
set vartest3=test3
set vartest4=test4
set vartest5=test5
set vartest5=test6
set vartest6=test7


Dieser Block:

set vartest1=test1
set vartest2=test2
set vartest3=test3
set vartest4=test4
set vartest5=test5
set vartest5=test6
set vartest6=test7


scheint zu funktionieren. Sprich: Diese Variablen werden dem callreadlist.bat übergeben. Nur sind das ja lediglich manuell gesetzte Testvariablen

Dieser Block:

endlocal
set "job1fld=%job1fld%"
set "job1dat=%job1dat%"
set "job1kyw=%job1kyw%"
set "job2fld=%job2fld%"
set "job2dat=%job2dat%"
set "job2kyw=%job2kyw%"
set "job3fld=%job3fld%"
set "job3dat=%job3dat%"
set "job3kyw=%job3kyw%"


sollte einige der eingelsenenen Variablen einfach nach dem "endlocal" erneut setzen damit diese auch erhalten bleiben wenn "readlist.bat" durchgelaufen ist. Nur klappt das nicht...

Wenn ich in diesen for-Schleifen vor dem "set" ein "endlocal eifüge:
endlocal
set job!cntr1!fld=%%A
setlocal enabledelayedexpansion

Dann wird "!cntr1!" auf einmal nicht mehr als Nummer interpretiert sondern als Test... Und folglich wird die Variable immer überschrieben...

Wie bringe ich es fertig, dass die eingelesenen Variablen mit übergeben werden? (Da ich ein absolutes Greenhorn bin was Batch-files angeht, wäre ich dankbar, wenn ihr mir nicht nur Tipps gebt, sondern Codes ;) )

Vielen Dank im Voraus!
 
Zuletzt bearbeitet:
endlocal kopiert die globalen Variablen zurück

Du kannst die Variablenwerte aus dem local Block nicht "retten"
 
Zuerst einmal Danke für die Antwort.

Aber das heisst es ist unmöglich Variablen einzulesen und zu übergeben?

Das kann ich mir irgendwie nicht vorstellen...
Was muss ich denn machen damit es klappt?
 
Hab's nicht weiter getestet, aber passt das Ergebnis, wenn Du das "setlocal ENABLEDELAYEDEXPANSION" in die callreadlist.bat verschiebst und dann in der readlist auf setlocal und endlocal verzichtest?

Wichtig ist dann nur, darauf zu achten, dass readlist.bat nur aus anderen BAT/CMD-Dateien aufgerufen wird, in denen "setlocal ENABLEDELAYEDEXPANSION" schon gesetzt ist.

callreadlist.bat
Code:
@echo off
setlocal ENABLEDELAYEDEXPANSION
call readlist.bat
set
pause

readlist.bat
Code:
REM =================================
REM =================================
REM TXT EINLESEN
@echo off

REM START: 1. Spalte Einlesen (Ordner)
set ColNo=1
set cntr1=0
for /F "delims=; tokens=%ColNo%" %%A in (Text.txt) do (
    set /a cntr1=!cntr1! + 1
    set job!cntr1!fld=%%A
)
REM ENDE: 1. Spalte Einlesen (Ordner)
REM START: 2. Spalte Einlesen (Jobname)
set ColNo=2
set cntr2=0
for /F "delims=; tokens=%ColNo%" %%A in (Text.txt) do (
    SET /A cntr2=!cntr2! + 1
    set job!cntr2!dat=%%A
)
REM ENDE: 2. Spalte Einlesen (Jobname)
REM START: 3. Spalte Einlesen (Keywords)
set ColNo=3
set cntr3=0
for /F "delims=; tokens=%ColNo%" %%A in (Text.txt) do (
    SET /A cntr3=!cntr3! + 1
    set job!cntr3!kyw=%%A
)
 
Du machst das LOCAL ja wahrscheinlich nur, wegen der delayed Expansion.

Dazu gibt es einen CMD Parameter der dann auf alle Variablen wirkt:
CMD /V:ON

Besser ist aber einen CALL mit Parametern zu verwenden. Schön wird das aber nie.
 
at HDScratcher:

Das wars! Jetzt scheint es zu klappen. Vielen Dank!

Eigentlich ganz simpel. Aber ich muss schon sagen so ganz logisch finde ich das nicht... setlocal ENABLEDELAYEDEXPANSION ist ja dann trotzdem gesetzt. Einfach schon ein skript früher...
 
Zurück
Oben