%CD%
работает так, как должно. Ваша проблема в том, что он расширяется до того, как ваш цикл for
запустится. Вместо этого используйте отложенное расширение:
setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (filesharelist.txt) do (
pushd %%A
echo CD=!CD!
REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
popd
)
Расширение переменной в cmd
немного нелогично. Нормальные переменные среды (в форме %foo%
, включая псевдопеременные, такие как %date%
, %cd%
, ...) раскрываются при синтаксическом анализе оператора, а не при его выполнении. Блоки, подобные следующему за do
считаются одним оператором, поэтому каждая переменная в блоке заменяется своим значением до того, как цикл for
запустится. Это означает, что %CD%
заменяется значением, которое было до цикла. Неудивительно, что это значение перед pushd
.
Задержка расширение получает вокруг вопроса путем расширения переменных прямо перед выполнением заявления. Они должны использовать !foo!
Форма для этого, хотя и должна быть явно активирована с помощью setlocal enabledelayedexpansion
или cmd
должен быть запущен с cmd /v:on
или он должен быть включен в реестре. Самый безопасный способ - первый, потому что он не зависит от какой-либо внешней конфигурации или среды.
Бонус-тест: Почему %DestinationDirectory%
прежнему работает так, как задумано?