Тема: CMD/BAT: %CD% не всегда верно показывает текущий путь
Выдержка из описания команды set /?:
%CD% - expands to the current directory string.
То есть, переменная должна указывать на текущий каталог. Но это не всегда верно. Например, если вы запустили некоторый скрипт из другого каталога и выполняете переход в другой каталог в цикле или подпроцессе (как правильно назвать блок команд в круглых скобках?) переменная %CD% будет указывать на исходный каталог, находясь в котором вы вызвали скрипт.
Пример
создайте каталог C:\tmp\test1\test2
создайте файл скрипта C:\tmp\test1.bat (см. ниже)
в консоли перейдите в любой другой каталог и запустите файл
@echo off
setlocal
echo:==== OK====
pushd "%~dpn0\test2"
echo:%CD%
cd
popd
echo:%CD%
cd
(
echo:==== FAIL ====
pushd "%~dpn0\test2"
echo:%CD%
cd
popd
echo:%CD%
cd
)
C:\Windows>c:\tmp\test1.bat
==== OK ====
c:\tmp\test1\test2
c:\tmp\test1\test2
C:\Windows
C:\Windows
==== FAIL ====
C:\Windows
c:\tmp\test1\test2
C:\Windows
C:\Windows
Предлааемое решение
Команда cd возвращает правильное значение для текущего пути. Казалось бы в чем проблема - используй ее? Но ведь это очередная ошибка или недокументированная особенность и лишние телодвижения при разработке.
Закрыть проблему можно с помощью отдельной подпрограммы. Хотя это может показаться тоже не очень удобно.
@echo off
setlocal
call :cd
(
call :cd
)
goto :EOF
:cd
echo:==== OK ====
pushd "%~dpn0\test2"
echo:%CD%
cd
popd
echo:%CD%
cd
goto :EOF

