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, 8109 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 ..
Ähnliche Inhalte
Batch & Shell
gelöst For Schleife für Abgleich mit Text-Datei und Unterverzeichnisse (4)

Frage von grisur zum Thema Batch & Shell ...

Batch & Shell
Verschachtelte For Schleife für Batch Neuling (3)

Frage von yperiu zum Thema Batch & Shell ...

Batch & Shell
gelöst Verlinkung erstellen Batch Datei mit for Schleife (2)

Frage von rusdav zum Thema Batch & Shell ...

Batch & Shell
gelöst Abfrage ERRORLEVEL springt aus der FOR Schleife (8)

Frage von Galindiesel zum Thema Batch & Shell ...

Neue Wissensbeiträge
Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(29)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Humor (lol)

Bester Vorschlag eines Supporttechnikers ever: APC

(15)

Erfahrungsbericht von DerWoWusste zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Rogue Access Point (21)

Frage von Axel90 zum Thema LAN, WAN, Wireless ...

Webbrowser
Windows 7 unbeliebte Internetseite sperren (13)

Frage von Daoudi1973 zum Thema Webbrowser ...

E-Mail
Fake E-Mail in Outlook für Demonstartionszwecke (12)

Frage von sascha382 zum Thema E-Mail ...

ISDN & Analoganschlüsse
gelöst Splitter - RJ45 zu RJ11? (12)

Frage von Waishon zum Thema ISDN & Analoganschlüsse ...