4

в пакетном файле я перебираю список 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 ответ1

7

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .