При работе с составными выражениями (группы команд, заключенных в круглые скобки) нужно учитывать, что переменные среды в командных файлах используются в режиме раннего связывания. С точки зрения логики выполнения командного файла это может привести к ошибкам.
Пусть есть командный файл 1.bat со следующим содержимым:
SET a=1
ECHO a=%a%
SET a=2
ECHO a=%a%
и командный файл 2.bat:
SET a=1
ECHO a=%a%
(SET a=2
ECHO a=%a% )
Казалось бы, результат выполнения этих двух файлов должен быть одинаковым: на экран выведутся две строки: "a=1" и "a=2". На самом же деле таким образом сработает только файл 1.bat, а файл 2.bat два раза выведет строку "a=1"!
Данную ошибку можно обойти, если для получения значения переменной вместо знаков процента (%) использовать восклицательный знак (!) и предварительно включить режим связывания времени выполнения командой SETLOCAL ENABLEDELAYEDEXPANSION. Таким образом, для корректной работы файл 2.bat должен иметь следующий вид:
SETLOCAL ENABLEDELAYEDEXPANSION
SET a=1
ECHO a=%a%
(SET a=2
ECHO a=!a! )