Переменные окружения полностью поставляются в составной команде до её выполнения (чтобы это увидеть можно не отключать режим вывода команд):
set a=1
set a=2& echo %a%
или
set a=1
(
set a=2
echo %a%
)
— выведет 1.
Для отложенного раскрытия переменных используйте
set /a M=%NUMBER_OF_PROCESSORS%/2 & echo !M!> 1.txt
— при этом перед этим в командном файле должна присутствовать команда
setlocal enabledelayedexpansion
или
cmd.exe
должен быть запущен с ключом
/v
или режим отложенного раскрытия переменных по умолчанию должен быть задан в реестре (см.
set /?
,
setlocal /?
,
cmd /?
).
Для отложенного раскрытия переменных, даже если соответствующий режим не включен, можно также воспользоваться командой
call
:
Кстати. В арифметическом присваивании
set /a
для отложенного раскрытия переменных их можно записывать не как
%var%
или
!var!
, а просто
var
:
set /a M = NUMBER_OF_PROCESSORS / 2