establecer declaraciones no parecen funcionar en mi archivo por lotes

He encontrado lo que parece ser una explicación de mi problema aquí.

Lote de DOS: ¿Por qué mis comandos de configuración no permiten que se almacene nada?

pero realmente no entiendo la explicación.

Aquí está mi guión ...

for /R /d  %%f in (\Product\Database\SQL\Project\Model\Scripts\*) DO (

REM echo %%f
SET !LOAD_FILE_FILTER= %%f\*.sql
echo file: %!LOAD_FILE_FILTER%
CALL %!BATCH_FILE% -u %!USER_NAME% -p %!PASSWORD% -s %!SERVER_NAME% -d %!DATABASE_NAME% -f %!LOAD_FILE_FILTER% -o %!LOG_FILE%
IF %!EchoErrors%==1 (
    ECHO [
    TYPE %!LOG_FILE%
    ECHO ]
)

)

El eco siempre imprime el archivo: * .sql y el script al que le paso esta var siempre se queja LOAD_FILE_FILTER está vacío.

He intentado agregarsetlocal EnableDelayedExpansion como se sugiere en el artículo, pero no resuelve el problema. losecho file: %!LOAD_FILE_FILTER% siempre imprime el último subdirectorio en el directorio desde el que estoy ejecutando. losecho %%f siempre imprime el valor correcto.

Lo que hace el '!' detrás de la variable hacer para / para mí?

En una nota al margen, ¿podría alguien explicarme la diferencia entre

SET! VAR y SET VAR

% VAR & &! VAR &! VAR! %% VAR

Respuestas a la pregunta(1)

Su respuesta a la pregunta