Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

GOTO EOF in FOR-Schleife beendet leider die ganze Batch-Datei. Aufruf mit Call dagegen nicht. Erklärung hierfür?

Frage Entwicklung Batch & Shell

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

08.01.2013, aktualisiert 23:52 Uhr, 7527 Aufrufe, 5 Kommentare

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:

Nicht funktionierender Code

01.
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln. 
02.
setlocal EnableDelayedExpansion 
03.
for %%d in ( 
04.
	{bootmgr} 
05.
	{current} 
06.
	) do ( 
07.
		set Type=%%d 
08.
		for /f "tokens=2 delims={}" %%e in ('bcdedit /enum !Type! /v ^|findstr /r "[{-}]"') do ( 
09.
			set GUID=%%e 
10.
			echo !GUID! 
11.
			goto :eof 
12.
13.
14.
setlocal DisableDelayedExpansion 
15.
 
16.
echo ERFOLG und PAUSE 
17.
:timeout /t 3 >nul 
18.
pause >nul
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).

Funktionierender Code

01.
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln. 
02.
setlocal EnableDelayedExpansion 
03.
for %%d in ( 
04.
	{bootmgr} 
05.
	{current} 
06.
	) do set Type=%%d & call :M5 
07.
 
08.
echo ERFOLG und PAUSE 
09.
:timeout /t 3 >nul 
10.
pause >nul 
11.
 
12.
 
13.
:M5 
14.
for /f "tokens=2 delims={}" %%e in ('bcdedit /enum %Type% /v ^|findstr /r "[{-}]"') do ( 
15.
	set GUID=%%e 
16.
	echo !GUID! 
17.
	goto :eof 
18.
19.
setlocal DisableDelayedExpansion
Natürlich bin ich für alle Lösungen offen.
Verbesserungsvorschläge sind immer willkommen.

Gruß
evinben
Mitglied: Hitman4021
08.01.2013 um 23:49 Uhr
Hallo,

Batch ist zwar nicht so meins aber, goto springt zum betreffenden Punkt und call sollte nur die Funktion aufrufen. Solange ich mich nicht Irre!

Gruß
Bitte warten ..
Mitglied: evinben
08.01.2013 um 23:59 Uhr
Hallo Hitman4021,

GOTO hat hier eine besondere Funktion und dieser Befehl benutz hier eine besondere Sprungmarke, nämlich :EOF (End Of File). Wir wissen ja, dass in FOR /F-Schleife generell eine untergeordnete CMD aufgerufen wird. D. h. hier soll der untergeordnete Prozess beendet werden, sobald sich etwas erledigt hat, also GOTO :END OF FILE in dem untergeordneten CMD-Prozess. Bitte eventuell um Korrektur.

Gruß
evinben
Bitte warten ..
Mitglied: bastla
09.01.2013, aktualisiert um 00:31 Uhr
Hallo evinben!

Eine (ungetestete) Alternative könnte etwa so aussehen:
01.
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln. 
02.
setlocal EnableDelayedExpansion 
03.
for %%d in ( 
04.
    {bootmgr} 
05.
    {current} 
06.
) do ( 
07.
    set "Type=%%d" 
08.
    set "GUID=" 
09.
    for /f "tokens=2 delims={}" %%e in ('bcdedit /enum !Type! /v ^|findstr /r "[{-}]"') do ( 
10.
        if not defined GUID ( 
11.
            set "GUID=%%e" 
12.
            echo !GUID! 
13.
14.
15.
16.
setlocal DisableDelayedExpansion 
17.
 
18.
echo ERFOLG und PAUSE 
19.
:timeout /t 3 >nul 
20.
pause >nul
Etwas schlanker:
01.
:Eintrags-IDs/GUIDs anhand des Typs (der Kurzschreibweise) ermitteln. 
02.
for %%d in ({bootmgr},{current}) do ( 
03.
    set "GUID=" 
04.
    for /f "tokens=2 delims={}" %%e in ('bcdedit /enum %%d /v ^|findstr /r "[{-}]"') do ( 
05.
        if not defined GUID ( 
06.
            set "GUID=%%e" 
07.
            echo %%e 
08.
09.
10.
11.
 
12.
echo ERFOLG und PAUSE 
13.
:timeout /t 3 >nul 
14.
pause >nul
Grüße
bastla
Bitte warten ..
Mitglied: 106543
09.01.2013 um 08:32 Uhr
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
Bitte warten ..
Mitglied: evinben
09.01.2013 um 11:05 Uhr
Hallo Bastla!

dankbar dir habe ich nun den Fehler erkannt, was mich am meistens freut und vor allem beruhigt.
Nämlich muss ich ab nun verstärkt darauf achten nicht wieder zu vergessen, dass bei Verwendung von setlocal EnableDelayedExpansio die Variable explizit gelöscht werden muss (hier im Falle set "GUID="). Ansonsten wird diese in die nächste Runde mitgeschleppt und daher hat bei meinen Versuche if not defined GUID nicht weiter geholfen gehabt (da sie so doch bis zu der allerletzten Runde definiert bleibt und daher werden im Gegensatz zu meinem Wunsch alle Ergebnisse ausgegeben).
Obwohl ich solche Fälle (bei Verwendung von setlocal EnableDelayedExpansio) schon mal erlebt habe, bei denen ich die Fehler dann verspätet gefunden habe (set var=), bin ich nach mehrmaligem Experimentieren diesmal einfach nicht drauf gekommen. Etwas Rutine fehlt noch …

Danke, dass es euch hier gibt!

Und Bastla du darfst dir gerne wieder ein Eis wünschen.

Gruß
evinben
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Probleme mit Dateipfaden in for-Schleife (1)

Frage von Jonas1806 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Schleife als FOR-SCHLEIFE (2)

Frage von mp2711 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...