deb10er0
Goto Top

Batch-Prog führt echo 4x aus

Hallo, erstmal!

Könnt Ihr euch mal meinen Quellcode mal anschauen. Liegt wahrscheinlich an den For-Schleifen. Mein echo-Befehl wird immer 4x ausgeführt, finde dazu aber keine Lösung. Könnt Ihr mir bitte helfen?

echo off
rem set profil=%1
set profil=frank
set pfad_lokal=D:\%profil%\lokal.dat
set pfad_server=D:\%profil%\server.dat 

for /f "delims=" %%i in ('dir %pfad_lokal% /s /b /a-d') do call :splitDateLokal %%~ti  
:splitDateLokal
for  /f "tokens=1-5 delims=.:," %%a in ("%1.%2") do (   
               set TT_L=%%a
               Set MM_L=%%b
               Set JJ_L=%%c
               Set hh_L=%%d
               Set mi_L=%%e

)

for /f "delims=" %%i in ('dir %pfad_server% /s /b /a-d') do call :splitDateServer %%~ti  
:splitDateServer
for  /f "tokens=1-5 delims=.:," %%a in ("%1.%2") do (   
               set TT_S=%%a
               Set MM_S=%%b
               Set JJ_S=%%c
               Set hh_S=%%d
               Set mi_S=%%e
)

set zeitlokal=%TT_L%%MM_L%%JJ_L%%hh_L%%mi_L%
rem set zeitserver=%TT_S%%MM_S%%JJ_S%%hh_S%%mi_S%
echo %zeitlokal%
rem echo %zeitserver%

Content-Key: 113930

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

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: bastla
bastla 15.04.2009 um 16:58:21 Uhr
Goto Top
Hallo deb10er0 und willkommen im Forum!

Da Du Unterprogramme aufrufst, musst Du auch dafür sorgen, dass diese, aber auch das Hauptprogramm, ordnungsgemäß (mit einem goto :eof) abgeschlossen werden:
echo off & setlocal
rem set profil=%1
set profil=frank
set pfad_lokal=D:\%profil%\lokal.dat
set pfad_server=D:\%profil%\server.dat 

for /f "delims=" %%i in ('dir %pfad_lokal% /s /b /a-d') do call :splitDateLokal %%~ti  
for /f "delims=" %%i in ('dir %pfad_server% /s /b /a-d') do call :splitDateServer %%~ti  

set zeitlokal=%TT_L%%MM_L%%JJ_L%%hh_L%%mi_L%
rem set zeitserver=%TT_S%%MM_S%%JJ_S%%hh_S%%mi_S%
echo %zeitlokal%
rem echo %zeitserver%
::Ende Hauptprogramm
goto :eof

:splitDateLokal
for  /f "tokens=1-5 delims=.:," %%a in ("%1.%2") do (   
               set TT_L=%%a
               Set MM_L=%%b
               Set JJ_L=%%c
               Set hh_L=%%d
               Set mi_L=%%e

)
goto :eof

:splitDateServer
for  /f "tokens=1-5 delims=.:," %%a in ("%1.%2") do (   
               set TT_S=%%a
               Set MM_S=%%b
               Set JJ_S=%%c
               Set hh_S=%%d
               Set mi_S=%%e
)
goto :eof
Das letzte "goto :eof" ist zwar entbehrlich (da dies nach der letzten Batchzeile automatisch ausgeführt wird), aber es schadet nicht, und wenn Du noch weitere Unterprogramme hinzufügen solltest, benötigst Du es auf jeden Fall ...

Grüße
bastla
Mitglied: Biber
Biber 15.04.2009 um 17:04:10 Uhr
Goto Top
Moin deb10er0,

willkommen in Forum.
Ich hab es zufällig gerade vorhin hier in einem anderen Beitrag gelesen:

  • mit "call :whatever" aufgerufene Blöcke werde explizit beendet mit der Anweisung "goto :eof" in ihrer letzten Zeile
  • ebenso muss nach einer Anweisung, auf die eine zeile mit Sprungmarke folgt
<code type = "plain">....{Beispiel FALSCH}
for /f "delims=" %%i in ('dir %pfad_lokal% /s /b /a-d') do call :splitDateLokal %%~ti
:splitDateLokal
...

eine Sprung/goto :eof-Anweisung VOR die folgende Sprungmarke.
Sonst werden diese zeilen einfach auch noch ausgeführt
(eine Zeile nach der anderen, bis das Ende des Batches erreicht ist)
<code type = "plain">....{Beispiel WENIGER FALSCH}
for /f "delims=" %%i in ('dir %pfad_lokal% /s /b /a-d') do call :splitDateLokal %%~ti
: goto :Eof

REM ~~~~ hier ist der Batch logisch am Ende;
REM ~~~~ es folgen nur noch Unter-Routinen
:splitDateLokal
...


Grüße
Biber
[Edit] Hätte mich auch gewundert, wenn ich vor bastla zu Ende getippt hätte...face-wink [/Edit]
Mitglied: deb10er0
deb10er0 16.04.2009 um 08:03:57 Uhr
Goto Top
Hey, super!!
Danke hat funktioniert!