Top-Themen

Aktuelle Themen (A bis Z)

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?

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

08.01.2013, aktualisiert 23:52 Uhr, 8581 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
Batch Schleife als FOR-SCHLEIFE
gelöst Frage von mp2711Batch & Shell2 Kommentare

Mit den FOR-Schleifen habe ich mich leider bislang zu selten auseinander gesetzt, aber da ich sonst gerade nicht weiter ...

Batch & Shell
Batch Problem bei einer For Schleife
gelöst Frage von Juergen42Batch & Shell2 Kommentare

Hallo Ich komme nicht dahinter ist sicher nur ein kleines Problem, aber es wird keine Ausgabe gemacht Eigentlch willich ...

Batch & Shell
Batch - Hilfe bei FOR-Schleife
gelöst Frage von makroll10Batch & Shell8 Kommentare

Hallo, aus einer Access-Datenbank heraus rufe ich per VBA den u.a. Batch mit den Parametern: Reports!UB_System!Pfad ("C:\Users\User\Documents\Polar\") und Reports!UB_Polar!hrmexport1 ...

Batch & Shell
Batch Variablen in for-Schleife
gelöst Frage von Dacki1107Batch & Shell2 Kommentare

Hallo Liebe Administratoren Ich kämpfe mit einem kleinen Problemchen und hoffe das Ihr mir helfen könnt. Ich versuche eine ...

Neue Wissensbeiträge
Vmware
VMware Update für den ESXi 5.5 verfügbar
Information von sabines vor 20 StundenVmware

Nach dem ganzen Hickhack um Update mit Microcode Anpassungen und Rückzug, gibt es nun für den ESXi 5.5 ein ...

CPU, RAM, Mainboards

Meltdown und Spectre: Intel zieht Microcode-Updates für Prozessoren zurück

Information von keine-ahnung vor 1 TagCPU, RAM, Mainboards5 Kommentare

Moin, extrem lutztig. Nur gut, dass ich noch nicht beim Probanden-Bingo mitgemacht habe :-) LG, Thomas

Router & Routing
PfSense als Addon auf QNAP
Information von magicteddy vor 1 TagRouter & Routing7 Kommentare

Moin, für Spielereien eine ganz nette Idee aber ich fürchte das soetwas auch als echte Firewall genutzt wird: In ...

Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 1 TagDatenschutz1 Kommentar

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
gelöst Frage von a-za-zNetzwerkmanagement26 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Server
TEMP-Profile
gelöst Frage von Forseti2003Windows Server21 Kommentare

Guten Morgen, wer kennt sie nicht, die lieben Temporären Benutzerprofile, vorallem immer dann, wenn man sie am wenigsten braucht. ...

Multimedia & Zubehör
Welches Tablet für die Verkäufer?
Frage von Hendrik2586Multimedia & Zubehör16 Kommentare

Guten Morgen meine Lieben, vielleicht könnt ihr mir ja helfen. Es geht um unsere Außendienstmitarbeiter /Verkäufer. Sie sollen demnächst ...

Ubuntu
Ubuntu - Routing mit 2 Netzwerkkarten?
Frage von gabrixlUbuntu13 Kommentare

Hei Folgende Situation: Ich habe zwei virtuelle Maschinen: 1 - Server für DHCP, DNS und Routing - Netzwerkkarte 1: ...