Переменные окружения полностью поставляются в составной команде до её выполнения (чтобы это увидеть можно не отключать режим вывода команд):
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