GOTO EOF in FOR-Schleife beendet leider die ganze Batch-Datei. Aufruf mit Call dagegen nicht. Erklärung hierfür?
Hallo,
das Ziel hier ist zwei Datensätze nacheinander abzuarbeiten ({bootmgr} und {current}) und insgesamt nur zwei Ergebnisse anzuzeigen (also pro Datensatz nur ein Ergebnis).
GOTO :EOF in der untergeordneten FOR-Schleife beendet nach dem ersten gefundenen Ergebnis leider nicht dieselbe und kehr zurück zu der übergeordneten, sondern im Anschluss den ganzen Batch-Prozess.
So eine Konstruktion führt nicht zu dem gewünschten Ergebnis:
Wir kommen so nicht zu der ECHO-Ausgabe "ERFOLG und PAUSE".
Mit CALL-Aufruf-Methode funktioniert der Prozess wie erwartet, jedoch interessiert mich nun brennend andere Lösungen zu erfahren und am besten solche, die nicht zu arg sehr wie Grashüpfer hin und her hüpfen (z. B. solche innerhalb der FOR-Schleife, ähnlich wie in dem 1. Beispiel schon mal angedeutet ist).
Natürlich bin ich für alle Lösungen offen.
Verbesserungsvorschläge sind immer willkommen.
Gruß
evinben
das Ziel hier ist zwei Datensätze nacheinander abzuarbeiten ({bootmgr} und {current}) und insgesamt nur zwei Ergebnisse anzuzeigen (also pro Datensatz nur ein Ergebnis).
GOTO :EOF in der untergeordneten FOR-Schleife beendet nach dem ersten gefundenen Ergebnis leider nicht dieselbe und kehr zurück zu der übergeordneten, sondern im Anschluss den ganzen Batch-Prozess.
So eine Konstruktion führt nicht zu dem gewünschten Ergebnis:
Nicht funktionierender Code
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln.
setlocal EnableDelayedExpansion
for %%d in (
{bootmgr}
{current}
) do (
set Type=%%d
for /f "tokens=2 delims={}" %%e in ('bcdedit /enum !Type! /v ^|findstr /r "[{-}]"') do (
set GUID=%%e
echo !GUID!
goto :eof
)
)
setlocal DisableDelayedExpansion
echo ERFOLG und PAUSE
:timeout /t 3 >nul
pause >nul
Mit CALL-Aufruf-Methode funktioniert der Prozess wie erwartet, jedoch interessiert mich nun brennend andere Lösungen zu erfahren und am besten solche, die nicht zu arg sehr wie Grashüpfer hin und her hüpfen (z. B. solche innerhalb der FOR-Schleife, ähnlich wie in dem 1. Beispiel schon mal angedeutet ist).
Funktionierender Code
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln.
setlocal EnableDelayedExpansion
for %%d in (
{bootmgr}
{current}
) do set Type=%%d & call :M5
echo ERFOLG und PAUSE
:timeout /t 3 >nul
pause >nul
:M5
for /f "tokens=2 delims={}" %%e in ('bcdedit /enum %Type% /v ^|findstr /r "[{-}]"') do (
set GUID=%%e
echo !GUID!
goto :eof
)
setlocal DisableDelayedExpansion
Natürlich bin ich für alle Lösungen offen.
Verbesserungsvorschläge sind immer willkommen.
Gruß
evinben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 196651
Url: https://administrator.de/forum/goto-eof-in-for-schleife-beendet-leider-die-ganze-batch-datei-aufruf-mit-call-dagegen-nicht-erklaerung-196651.html
Ausgedruckt am: 25.12.2024 um 18:12 Uhr
5 Kommentare
Neuester Kommentar
Hallo evinben!
Eine (ungetestete) Alternative könnte etwa so aussehen:
Etwas schlanker:
Grüße
bastla
Eine (ungetestete) Alternative könnte etwa so aussehen:
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln.
setlocal EnableDelayedExpansion
for %%d in (
{bootmgr}
{current}
) do (
set "Type=%%d"
set "GUID="
for /f "tokens=2 delims={}" %%e in ('bcdedit /enum !Type! /v ^|findstr /r "[{-}]"') do (
if not defined GUID (
set "GUID=%%e"
echo !GUID!
)
)
)
setlocal DisableDelayedExpansion
echo ERFOLG und PAUSE
:timeout /t 3 >nul
pause >nul
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln.
for %%d in ({bootmgr},{current}) do (
set "GUID="
for /f "tokens=2 delims={}" %%e in ('bcdedit /enum %%d /v ^|findstr /r "[{-}]"') do (
if not defined GUID (
set "GUID=%%e"
echo %%e
)
)
)
echo ERFOLG und PAUSE
:timeout /t 3 >nul
pause >nul
bastla
Hi,
wenn ich mich nicht all zu sehr irre, bewirkt dein "goto", dass die Batch an die gegebene Stelle springt während "call" alles was nach der betreffenden Sprungmarke steht ausführt und danach zum Ursprungsort zurückkehrt.
Grüße
Exze
wenn ich mich nicht all zu sehr irre, bewirkt dein "goto", dass die Batch an die gegebene Stelle springt während "call" alles was nach der betreffenden Sprungmarke steht ausführt und danach zum Ursprungsort zurückkehrt.
Grüße
Exze