Filenamen in Batch Datei vergleichen

Hallo,
mein script funktioniert allerdings arbeitet es nicht mit wildcards in den exclusions. Sollte es aber!

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
:: Exlusion hier ergänzen
    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=
)

Die for schleife liest Filenamen aus einem Log, die %excl?% sollen kopiert werden der rest in ein HTML geschrieben werden.
Hat jemand eine Idee wie ich hier wildcards in den exclusions verarbeiten könnte

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).