%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% прежнему работает так, как задумано?