В пакетном файле я перебираю список путей 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%
все еще работает как задумано?