Определенно PUSHD / POPD является предпочтительным способом сделать это. Но есть функция (недокументированная?) SETLOCAL / ENDLOCAL, которая выполняет то же самое (в дополнение ко всему, что делает SETLOCAL).
Если вы измените каталог после SETLOCAL, то вы вернетесь в исходный каталог после ENDLOCAL.
cd OriginalLocation
setlocal
cd NewLocation
endlocal
rem we are back to OriginalLocation
Еще одна вещь с SETLOCAL, что задокументировано - Любая SETLOCAL в вызываемой партии или: метка: будет завершена неявным ENDLOCAL при выходе из партии или подпрограммы. Неявный ENDLOCAL вернется в исходную папку так же, как явный ENDLOCAL.
cd OriginalLocation
call :ChangeLocation
rem - We are back to OriginalLocation because :ChangeLocation did CD after a SETLOCAL
rem - and there is an implicit ENDLOCAL upon return
exit /b
:ChangeLocation
setlocal
cd NewLocation
exit /b
Я бы не рекомендовал использовать SETLOCAL / ENDLOCAL вместо PUSHD / POPD. Но это поведение, которое вы должны знать.
Ответ на комментарий Джонни
Это может сбить с толку, когда PUSHD / POPD и SETLOCAL / ENDLOCAL объединены. ENDLOCAL не очищает стек PUSHD, о чем свидетельствует следующее:
setlocal
cd test
@cd
pushd new
@cd
endlocal
@cd
popd
@cd
- ВЫВОД -
D:\test>setlocal
D:\test>cd test
D:\test\test
D:\test\test>pushd new
D:\test\test\new
D:\test\test\new>endlocal
D:\test
D:\test>popd
D:\test\test