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, 8817 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
Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 3 StundenSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 8 StundenWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Microsoft Office

MS Office 2019 ohne OneNote - OneNote App speichert nur in Cloud

Information von Deepsys vor 19 StundenMicrosoft Office2 Kommentare

Microsoft zeigt deutlich wohin alles bei Ihnen geht, OneNote 2019 wird es nicht mehr geben, und die Windows 10 ...

Humor (lol)

Warum man sein Gast-WLAN nicht beliebig nennen sollte

Erfahrungsbericht von Henere vor 1 TagHumor (lol)5 Kommentare

Servus, mal was aus dem Alltag. Zu Hause. Eigentlich wollte ich nur einen weiteren WLAN-AP ins Netz bringen, damit ...

Heiß diskutierte Inhalte
Windows Netzwerk
LAN nur 10MB pro s trotz gb lan
Frage von tsunamiWindows Netzwerk21 Kommentare

Hallo zusammen, ich brauche mal wieder einen Anstoß in die richtige Richtung. Ich habe einen Windows 10 pc mit ...

Festplatten, SSD, Raid
Server SSD: NVMe PCIe 3.0 RAID?
Frage von bouneeFestplatten, SSD, Raid15 Kommentare

Hallo liebe Admins, mir stellt sich gerade die Frage, ob ein neuer Server mit SSD NVMe PCIe 3.0 Sinn ...

Sonstige Systeme
Wie Normenkataloge im Unternehmen bereit stellen?
Frage von MuzzepuckelSonstige Systeme13 Kommentare

Hallo Kollegen, ich lese schon lange hier mit, nun mein ersrer Beitrag, bzw. Frage. :-) Wir benötigen für unsere ...

Windows 10
Windows 10 Startmenü-Einstellungen Systemweit festlegen
Frage von flotautWindows 1013 Kommentare

Guten Morgen liebe Admins, wir möchten bei uns am Lehrstuhl demnächst auf Windows 10 umsteigen. Wir installieren unsere PC's ...