Пакетный анализатор имеет много этапов. См. Как интерпретатор сценариев команд Windows (CMD.EXE) анализирует? для получения дополнительной информации.
Параметры оператора FOR анализируются перед расширением переменной FOR, поэтому вы не можете использовать переменные FOR (или отложенное расширение) в параметрах FOR.
Я вижу два обходных пути:
1) PUSHD в корневую папку, чтобы /R
правильно работал с текущим каталогом.
Мне нравится этот вариант больше всего.
for %%A in (tmp1,tmp2,tmp3) do (
pushd c:\%%A
for /R %%B in (*.txt) do copy %0 "%%~B" /Y
popd
)
2) Передать значение в аргумент CALL
for %%A in (tmp1,tmp2,tmp3) do call :copyLoop c:\%%A
exit /b
:copyLoop
for /r %1 %%B in (*.txt) do copy %0 "%%~B" /Y
exit /b