stoner
Goto Top

Parameter aus Datei in For /f abarbeiten

Hallo,

ich habe eine Batch in der u.a. Paramter aus einer Datei eingelesen werden sollten:


For /F "tokens=2,3 delims=|" %%a in (getgez.ini) do (  
    set IP=%%a&& set sys=%%b
     IF "%IP%"=="EOF" goto wait  
     tftp %IP% get gez.txt gez%sys%.gez >> transfer.log
     IF not exist gez%sys%.gez start eamerror.exe && ECHO TK-Anlage unter %IP% nicht erreicht.>>transfer.log
     call gez2db.bat gez%sys%.gez )

in der GETGEZ.ini steht folgendes:
SYS1|192.168.0.90|110
SYS2|192.168.0.91|120
SYS3|192.168.0.92|130
Ende|EOF|000

Leider klappt das so nicht ganz. Beim starten der bat werden die Parameter ausgelesen,set IP und set sys zeigen bei jedem Ablauf jeweils die richtige IP und Nummer, jedoch wird pro Ablauf immer nur der erste oder letzte Parameter in den Variablen genutzt (zuerst 192.168.0.90, dann EOF usw.):

set IP=192.168.0.90  && set sys=110
 IF "192.168.0.90" == "EOF" goto wait  
 tftp 192.168.0.90 get gez.txt gez110.gez  1>>transfer.log
 IF not exist gez110.gez start eamerror.exe   && ECHO TK-Anlage unter 192.168.0.90 nicht erreicht. 1>>transfer.log
 call gez2db.bat gez110.gez
...
set IP=192.168.0.91  && set sys=120
 IF "192.168.0.90" == "EOF" goto wait  
 tftp 192.168.0.90 get gez.txt gez110.gez  1>>transfer.log
 IF not exist gez110.gez start eamerror.exe   && ECHO TK-Anlage unter 192.168.0.90 nicht erreicht. 1>>transfer.log
 call gez2db.bat gez110.gez
...
set IP=192.168.0.92  && set sys=130
 IF "192.168.0.90" == "EOF" goto wait  
 tftp 192.168.0.90 get gez.txt gez110.gez  1>>transfer.log
 IF not exist gez110.gez start eamerror.exe   && ECHO TK-Anlage unter 192.168.0.90 nicht erreicht. 1>>transfer.log
 call gez2db.bat gez110.gez
...
nächster ABlauf:
...
set IP=%a  && set sys=%b
 IF "EOF" == "EOF" goto wait  
 tftp EOF get gez.txt gez000.gez  1>>transfer.log
 IF not exist gez000.gez start eamerror.exe   && ECHO TK-Anlage unter EOF nicht erreicht. 1>>transfer.log
 call gez2db.bat gez000.gez
)

X:\Downloads\K+B\easyAM\HP3000\test>(
set IP=192.168.0.90  && set sys=110
 IF "EOF" == "EOF" goto wait  
 tftp EOF get gez.txt gez000.gez  1>>transfer.log
 IF not exist gez000.gez start eamerror.exe   && ECHO TK-Anlage unter EOF nicht erreicht. 1>>transfer.log
 call gez2db.bat gez000.gez
)

Ich habe schon alles mögliche rumprobiert und gesucht, leider ohne Erfolg.
Weis jemand hier Abhilfe?

Besten Dank schon mal,

Frank

Content-Key: 38359

Url: https://administrator.de/contentid/38359

Printed on: April 18, 2024 at 09:04 o'clock

Member: Biber
Biber Aug 20, 2006 at 13:16:34 (UTC)
Goto Top
Moin stoner,

ist wieder ein Fall optischer Täuschung.
Das, was in Deinem Skript wie mehrere Zeilen aussieht, ist für den CMD-Interpreter eine einzige.
Entsprechend werden die Variablen in der Klammer nach dem "FOR /F" nur einmal aufgelöst - und haben nicht den Wert, den Du erwartest.

Lösung über "Setlocal EnableDelayedExpansion" oder über zusätzlich Aufruf eines geCALLten Blocks.
Die Forumssuche nach DelayedExpansion liefert Dir einpaar ähnlich Beispiele.

::--- Solution1.bat.....mit verzögerter Variablenauflösung
@echo off & setlocal EnableDelayedExpansion
For /F "tokens=2,3 delims=|" %%a in (getgez.ini) do (  
    set IP=%%a&& set sys=%%b
     IF !%IP%!=="EOF" goto wait  
     tftp !IP! get gez.txt gez!sys!.gez >> transfer.log
     IF not exist gez!sys!.gez start eamerror.exe && ECHO TK-Anlage unter !IP! nicht erreicht.>>transfer.log
     call gez2db.bat gez!sys!.gez ) 

@echo off & setlocal
For /F "tokens=2,3 delims=|" %%a in (getgez.ini) do call :subroutine %%a %%b  
goto :eof

:subroutine
    set IP=%1 && set sys=%2
     IF "%IP%"=="EOF" goto wait  
     tftp %IP% get gez.txt gez%sys%.gez >> transfer.log
     IF not exist gez%sys%.gez start eamerror.exe && ECHO TK-Anlage unter %IP% nicht erreicht.>>transfer.log
     call gez2db.bat gez%sys%.gez 
goto :eof

Hope That Helps
Biber
Member: stoner
stoner Aug 20, 2006 at 18:11:51 (UTC)
Goto Top
Hi Biber,

besten Dank (wieder mal face-wink) für deine Hilfe.
Auf DelayedExpansion bin ich vorher schon aufmerksam geworden, leider klappt das nicht.
Darauf dass ich über CALL arbeiten könnte ist mir selber erst zu spät eingefallen.
Dank deiner Hilfe habe ich es folgendermassen gelöst:

For /F "tokens=2,3 delims=|" %%a in (getgez.ini) do call :getsys %%a %%b  
goto :wait
:getsys
set IP=%1&& set sys=%2
IF "%IP%"=="EOF" goto wait  
tftp %IP% get gez.txt gez%sys%.gez >> transfer.log
IF not exist gez%sys%.gez (
      start eamerror.exe && ECHO TK-Anlage unter %IP% nicht erreicht.>>transfer.log
 ) ELSE (
     call gez2db.bat gez%sys%.gez
 )
goto :eof

es klappt soweit, und ich hoffe dass ich sonst auch keinen Wurm hineingebracht habe.

Besten Dank,

Frank
Member: Biber
Biber Aug 21, 2006 at 02:28:51 (UTC)
Goto Top
Thx, stoner,
für das Posten Deiner Lösung.

Ich habe eben oben in meinem Kommentar nochmal einen Copy/paste-Fehler korrigiert.
Hatte im zweiten Beispiel auch
set IP=%%a&& set sys=%%b
stehen. Muss dort natürlich
set IP=%1 && set sys=%2
heißen. Hast Du, stoner aber ja vor mir gefunden und berichtigt. face-wink

Copy & Paste ist der größte Qualitätskiller bei der Programmierung - leider setze ich mich auch manchmal darüber hinweg face-wink

Grüße
Biber
Member: stoner
stoner Aug 21, 2006 at 17:54:11 (UTC)
Goto Top
Danke nochmal,

Fall gelöst face-smile

Ciao
Frank