Невозможно вернуться в исходный рабочий каталог при запуске ручек nodejs в пакетном файле Windows

Ка Фай Ло

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%
MC ND

Как вы указываете, это работает

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] Удалить.

Отредактировано в
0

я говорю два предложения

0обзор
Войти в системуУчаствуйте в комментариях

Статьи по теме

TOP список

  1. 1

    Распределение Рэлея Curve_fit на Python

  2. 2

    Редактировать существующий файл Excel C # npoi

  3. 3

    Резервное копирование / восстановление kafka и zookeeper

  4. 4

    Flutter: Unhandled Exception: FileSystemException: Creation failed, path = 'Directory: '' (OS Error: Read-only file system, errno = 30)

  5. 5

    Ipython использует% store magic для получения динамического имени

  6. 6

    Как получить список индексов всех значений NaN в массиве numpy?

  7. 7

    Bogue étrange datetime.utcnow()

  8. 8

    Как добавить Swagger в веб-API с поддержкой OData, работающий на ASP.NET Core 3.1

  9. 9

    В типе Observable <unknown> отсутствуют следующие свойства из типа Promise <any>.

  10. 10

    Дженерики и потоки Java

  11. 11

    Как изменить значок приложения для проекта libgdx android

  12. 12

    Почему бы не выдать ошибку ERROR в тесте Jasmine?

  13. 13

    Выполнение команд PowerShell в программе Java

  14. 14

    How to convert C++/CLI string to const char*

  15. 15

    Почему actionPerformed выполняется двумя потоками?

  16. 16

    Как отфильтровать несколько столбцов в Qtableview?

  17. 17

    Passing Core Data objects from UITableViewCell to another View Controller

  18. 18

    discord.py: on_message (message) не работает несколько дней

  19. 19

    Как прикрепить файл как вложение к письму с помощью SendGrid?

  20. 20

    Динамическое создание точек / квадратов внутри Picturebox

  21. 21

    Строка не читается после новой строки из .env в nodeJs

популярныйтег

файл