Hallo Markus
ich vermute da einen Zusammenhang mit der verzögerten Erweiterung von Umgebungsvariablen
siehe dazu Online Help
setlocal /?
set /?
====================================================================================
setlocal /?
Startet die Begrenzung des Gültigkeitsbereiches von Änderungen.
Änderungen der Umgebung nach SETLOCAL sind nur auf die Batchdatei bezogen.
Um die ursprünglichen Einstellungen wiederherzustellen, muss der Befehl
ENDLOCAL ausgeführt werden. Beim Erreichen des Endes einer Batchdatei wird ein
impliziertes ENDLOCAL für jegliche ausstehende SETLOCAL-Befehle ausgeführt.
SETLOCAL
Mit den Befehlserweiterungen wird der SETLOCAL-Befehl folgendermaßen verändert:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
Aktiviert bzw. deaktiviert Befehlserweiterungen. Geben Sie
CMD /? ein, um weitere Informationen zu erhalten.
ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
Aktiviert bzw. deaktiviert die verzögerte Erweiterung von
Umgebungsvariablen. Geben Sie SET /? ein, um weitere Informationen
zu erhalten.
Diese Änderungen sind bis zum nächsten ENDLOCAL-Befehl gültig,
und zwar unabhängig von vorherigen Einstellungen.
Der SETLOCAL-Befehl legt einen ERRORLEVEL fest, wenn ein Argument angegeben
wird. Dieser ist gleich Null für eines der beiden gültigen Argumente und
gleich Eins andernfalls. Das kann man in Batchprogrammen verwenden, um
festzustellen, ob die Befehlserweiterungen zur Verfügung stehen. Siehe dazu
auch folgendes Beispiel:
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo keine Befehlserweiterungen
Dieses Verfahren kann man verwenden, weil in älteren Versionen von CMD.EXE der
SETLOCAL-Befehl keinen ERRORLEVEL festlegt. Der VERIFY-Befehl mit einem
ungültigen Argument initialisiert den Wert für den ERRORLEVEL mit ungleich
Null.
====================================================================================
Ausschnitt aus
set /?
Die Unterstützung der verzögerten Erweiterung von Umgebungsvariablen wurde
hinzugefügt. Standardmäßig ist sie deaktiviert. Sie kann mit der
Befehlszeilenoption /V von CMD.EXE aktiviert/deaktiviert werden.
Siehe CMD /?
Die verzögerte Erweiterung von Variablen verbessert die Möglichkeiten der
Variablenerweiterung. Bisher wurden die Variablen beim Lesen des Texts, und
nicht bei dessen Ausführung, erweitert. Das folgende Beispiel zeigt ein
Problem, das dabei auftritt:
set VAR=vorher
if "%VAR%" == "vorher" (
set VAR=nachher;
if "%VAR%" == "nachher" @echo Es funktioniert!
)
Die Meldung würde nie angezeigt, weil %VAR% in beiden IF-Befehlen
beim Lesen des ersten IF-Befehls erweitert wird, weil es logisch zu diesem
gehört. Daher vergleicht der zweite IF-Befehl "vorher" mit "nachher" was nie
gleich sein kann. Auch das folgende Beispiel funktioniert nicht wie erwartet:
set LISTE=
for %i in (*) do set LISTE=%LISTE% %i
echo %LISTE%
Es wird KEINE Liste der Dateien im aktuellen Verzeichnis erstellt, stattdessen
erhält LISTE den Namen der letzten Datei als Wert. Dies ist der Fall, weil
%LISTE% nur einmal beim Lesen des IF-Befehls erweitert wird. Zu diesem
Zeitpunkt ist LISTE leer.
Die FOR-Schleife, die tatsächlich ausgeführt wird, lautet:
for %i in (*) do set LISTE= %i
Hiermit wird der Variablen LISTE immer wieder der letzte Dateiname
zugewiesen.
Die verzögerte Erweiterung von Umgebungsvariablen erlaubt es, eine
Umgebungsvariable, unter Verwendung eines weiteren Zeichens (dem
Ausrufezeichen), zur Laufzeit zu erweitern. Mit aktivierter verzögerter
Erweiterung von Umgebungsvariablen können obige Beispiele wie folgt geschrieben
werden:
set VAR=vorher
if "%VAR%" == "vorher" (
set VAR=nachher
if "!VAR!" == "nachher" @echo Es funktioniert!
)
set LISTE=
for %i in (*) do set LISTE=!LISTE! %i
echo %LISTE%
====================================================================================
------------------
mit freundlichen Grüssen
Toni
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP