1.bat - делает как положено: зайти во временную папку, что-то сделать, вернуться в исходную папку. Текущий рабочий каталог (cwd) остается таким же до и после запуска 1.bat.
2.bat - когда 'do something' запускает пакет nodejs handlebars, даже если он только что-то печатает, после выхода из командного файла cwd изменяется .
3.bat - не использовать PUSHD, POPD. То же, что и 2.bat.
При запуске аналогичных сценариев оболочки cwd никогда не меняется.
Вопрос: что не так? Как вернуться к оригинальному cwd?
REM 1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD
REM 2.bat
PUSHD %CD%
CD /D %TEMP%
handlebars --help
POPD
REM 3.bat
SET orgdir=%CD%
CD /D %TEMP%
handlebars --help
CD /D %orgdir%
Как вы указываете, это работает
REM 1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD
но это должно быть написано не так.
pushd
работает, сохраняя текущий активный каталог (который позже будет извлечен popd
), а затем изменяет его на указанный, при необходимости меняя приводное устройство и, при необходимости, сопоставляя букву диска при переходе на путь UNC.
пути должны быть заключены в кавычки, чтобы избежать проблем с пробелами или специальными символами
Итак, код должен быть
REM 1.bat
PUSHD "%temp%"
DIR
POPD
Теперь проблемный командный файл может быть
REM 2.bat
PUSHD "%temp%"
handlebars --help
POPD
но, если исходный файл не вернулся в предыдущий активный каталог, это также не удастся.
Почему? в Windows handlebars
команда - это командный файл. Когда пакетный файл вызывает другой, поток выполнения передается в вызываемый файл и не возвращается вызывающему, поэтому popd
не будет выполняться.
Чтобы вызвать дочерний пакетный файл и вернуть поток выполнения вызывающему, вам нужно будет использовать call
команду
REM 2.bat
PUSHD "%temp%"
call handlebars --help
POPD
Другой альтернативой в этом случае (если вам не нужно завершать изменения какой-либо переменной среды или продолжать выполнение команд в вызывающей программе) является использование setlocal
команды. Он сохраняет копию текущей среды, чтобы мы могли отменить любые изменения, внесенные в нее при вызове endlocal
команды или при завершении контекста пакета. Эта операция сохранения включает текущий активный каталог.
REM 2.bat
setlocal
cd /d "%temp%"
handlebars --help
Теперь поток выполнения не возвращается к вызывающей стороне, но в этом нет необходимости. Когда дочерний пакетный файл ( handlebars
) завершается, контекст пакета освобождается, и изменения в среде после setlocal
него отменяются.
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения