Это довольно известная проблема с пакетными файлами. Короткий ответ - командные файлы выполняются путем расширения переменных в строке перед их выполнением. Для многострочных блоков (в скобках) все переменные, не являющиеся циклами, раскрываются один раз, а затем цикл запускается. Ваше тело цикла по существу:
IF NOT %%i==%~nx0 (
echo %%i
set "FILE_LIST=pre_%%i"
echo pre_
)
Они добавили функцию под названием отложенное расширение где-то по пути (NT4 IIRC), которую можно включить в реестре или с помощью оператора SETLOCAL
. Измените ваш скрипт на что-то вроде:
@echo off
setlocal EnableDelayedExpansion EnableExtensions
pushd "%~dp0"
FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
IF NOT %%i==%~nx0 (
set "FILE_LIST=!FILE_LIST!%%i"
)
)
echo %FILE_LIST%
endlocal
pause
и это должно работать. Я ухожу из окна Windows до понедельника, но это должно быть достаточно близко. Если вы столкнетесь с какими-либо проблемами, прочитайте справку, указав FOR /?
и SETLOCAL /?
в командной строке.