Ist zwar „ein bisschen“ spät, aber ich bin erst gerade darüber gestolpert …
Das liegt daran, dass das Setzen von copy
nicht persistent ist und sofort nach dem IF
-Befehl wieder verloren geht.
FOR
und IF
erzeugen eine Sub-Shell und die darin gesetzten Umgebungsvariablen bleiben deshalb nur innerhalb dieser Sub-Umgebungen erhalten.
Dies kann aber umgangen werden, indem man den Befehl SETLOCAL EnableDelayedExpansion
voran stellt und eine sog. „erweiterte Umgebung“ erzeugt. Damit bleiben Variablen, die innerhalb einer Sub-Shell gesetzt werden, auch außerhalb derselben erhalten.
Allerdings muss in diesem Fall auch die Syntax der Variablen-Namen angepasst werden. Anstelle des Prozentzeichens (%
) muss zwingend das Ausrufezeichen (!
) angegeben werden (→ !copy!
anstatt %copy%
).
Dies gilt aber nicht für die Variablen der Befehlszeilen-Parameter (%1
, %2
, etc.) und des FOR
-Befehls (%%A
, %%B
, etc.). Hier muss das „%
“, bzw. „%%
“ erhalten bleiben.
Außerhalb dieser Sub-Shell gesetzte Variablen bleiben unabhängig davon erhalten und daher ist hier die Verwendung des „!
“ nicht zwingend erforderlich, aber ratsam, um Verwechslungen zu vermeiden.
Die erweiterte Umgebung kann mit dem Befehl SETLOCAL DisableDelayedExpansion
wieder aufgehoben werden. Allerdings hat diese auch nur maximal bestand während der Laufzeit der Shell-Ebene, in welcher sie erstellt wurde.
Zudem kann – je nach Windows-Version – die erneute Verwendung des SETLOCAL
-Befehls bisherige Variablen zurücksetzen. Daher ist es ratsam, die erweitere Umgebung für die gesamte Laufzeit der Batch (also an den Anfang) zu setzen. Dann kann man auch auf das Aufheben der erweiterten Umgebung verzichten.
So wird dann ein Schuh draus:
@echo off
SetLocal EnableDelayedExpansion
:: hier irgendein Initial-Code
for /f "usebackq delims=" %%a in (./Log.txt) do (
IF /i "!excl1!"=="%%~a" set copy=1
IF /i "!excl2!"=="%%~a" set copy=1
IF /i "!excl3!"=="%%~a" set copy=1
IF defined copy (
echo "!source!\%%~a"
echo "!savedir!\%%~a"
copy "!source!\%%~a" "!savedir!\%%~a"
) else (
echo "<p><a href=!savedir!\%%~a>%%~a</a></p>" >> !htmlfile!
)
set copy=
)
:: hier irgendein Folge-Code
Ich habe mir erlaubt, die Variablen-Vergleiche in doppelte Anführungszeichen zu setzen, für den Fall, dass diese ggf. Sonderzeichen enthalten, welche den Vergleich beeinflussen können (z.B. „
“, „=
“, „&
“, „,
“, etc.).
Die Tilde in der FOR
-Variable entfernt ggf. vorhandene Anführungszeichen. Voraussetzung hierfür ist natürlich, dass ggf. vorhandene Anführungszeichen beim Setzten der %excl?%
-Variablen entfernt werden (z.B. set excl1=%~1
).