Пакетный файл "для" циклов - несколько строк

Почему в пакетном файле работают следующие строки?

 for  %%a in ("C:\Test\*.txt") do set FileName=%%~a
 echo Filename is: %FileName%

Но это не будет?:

 for  %%a in ("C:\Test\*.txt") do (
     set FileName=%%~a
     echo Filename is: %FileName%
 )

Это похоже на то, что переменная "a" не сохраняется во второй строке. Почему это и как я использую содержимое "a", как во втором примере?

Ответы

Ответ 1

Это потому, что все между круглыми скобками загружается как одна строка. Таким образом, %FileName% расширяется (во время загрузки) до его установки (во время выполнения). Если вам нужно использовать второй формат, вам нужно включить отложенное расширение. Тогда вам будет сложно, если имя файла содержит !. Это будет работать, если в именах файлов нет скобок.

 setlocal enabledelayedexpansion
 for  %%a in ("C:\Test\*.txt") do (
     set FileName=%%~a
     echo Filename is: !FileName!
 )