почему %CD% не работает после использования pushd для UNC-пути?

почему %CD% не работает после использования pushd для UNC-пути?

В пакетном файле я перебираю список путей UNC в файле, использую pushd для изменения контекста на это местоположение, а затем выполняю команду. %CD% возвращает местоположение предыдущего каталога, а не текущего перемещенного каталога.

for /f "tokens=*" %%A in (filesharelist.txt) do (
 pushd %%A
 echo CD=%CD% - expecting x:\ or x:\subpath here, but get previous directory
 REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
 popd
)

Как получить текущий каталог?

решение1

%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% все еще работает как задумано?

Связанный контент