POPD — возврат в сохранённый каталог из стека PUSHD

POPD извлекает из стека каталог, сохранённый командой PUSHD, и делает его текущим. Незаменима в скриптах для возврата в исходную директорию.

POPD извлекает верхний элемент из стека каталогов, сформированного командой PUSHD, и немедленно переходит в него. Команда применяется в пакетных скриптах, когда нужно временно сменить рабочий каталог, выполнить операции и гарантированно вернуться в исходную директорию.

Синтаксис команды POPD

POPD

Команда не принимает аргументов. Каждый вызов POPD извлекает одну запись из стека. Если стек пуст, команда завершается без ошибки и без смены каталога. Стек формируется вызовами PUSHD — каждый PUSHD добавляет в стек текущий каталог перед переходом в новый.

Ключи и параметры

POPD не имеет ключей. Поведение команды полностью определяется состоянием стека, который ведёт PUSHD. Для просмотра текущего каталога после POPD используйте CD без аргументов или переменную %CD%.

Примеры использования

Базовый возврат в предыдущий каталог

Переходим в рабочий каталог, выполняем задачу и возвращаемся одной командой.

PUSHD C:\Logs
dir *.log
POPD

После POPD командная строка снова находится в том каталоге, откуда был вызван PUSHD.

Вложенный стек из нескольких каталогов

PUSHD можно вызывать несколько раз подряд — стек работает по принципу LIFO (последний добавленный извлекается первым).

PUSHD C:\Windows\System32
PUSHD C:\Temp
PUSHD D:\Backup
POPD
REM теперь текущий: C:\Temp
POPD
REM теперь текущий: C:\Windows\System32
POPD
REM возврат в исходный каталог

Каждый POPD снимает один слой стека; порядок возврата обратный порядку добавления.

Использование в bat-скрипте для изоляции рабочего каталога

Надёжный шаблон: скрипт меняет каталог для своей работы и всегда возвращается в исходный, даже если внутри произошла ошибка.

@echo off
PUSHD %~dp0
call build.bat
POPD
echo Вернулись в: %CD%

%~dp0 — путь к папке самого скрипта. После POPD управление возвращается в каталог, из которого скрипт был запущен.

Переход на сетевой ресурс через PUSHD и возврат через POPD

PUSHD умеет подключать UNC-пути как временный диск; POPD отключает его автоматически.

PUSHD \\server\share\reports
copy *.csv C:\LocalData\
POPD

При выполнении POPD временная буква диска (назначенная PUSHD) отключается, сетевой ресурс размонтируется.

Проверка, пуст ли стек

Если стек уже пуст, POPD не меняет каталог и не выдаёт ошибку. Проверить это можно косвенно через ERRORLEVEL или сравнив %CD% до и после:

SET before=%CD%
POPD
IF "%CD%"=="%before%" ECHO Стек был пуст

Сброс всего стека в конце скрипта

Если точное число PUSHD неизвестно, можно очистить стек в цикле:

:loop
SET prev=%CD%
POPD
IF NOT "%CD%"=="%prev%" GOTO loop
ECHO Стек очищен, текущий каталог: %CD%

Частые ошибки и решения

Ошибка / симптом Причина Решение
POPD не меняет каталог Стек пуст: PUSHD не вызывался или число POPD превысило число PUSHD Убедиться, что каждому POPD предшествует PUSHD; использовать отладочный вывод ECHO %CD%
Сетевой диск не отключается после POPD PUSHD подключил UNC как диск, но POPD вызван в другом процессе CMD Вызывать POPD в том же экземпляре CMD, где был PUSHD; стек не наследуется дочерними процессами
Скрипт завершается в неожиданном каталоге Забытый POPD или преждевременный EXIT прерывает скрипт до POPD Структурировать скрипт с меткой :finally и вызывать POPD перед каждым EXIT
«POPD» не распознаётся в PowerShell POPD — внутренняя команда CMD, в PowerShell отсутствует В PowerShell использовать Pop-Location / popd (псевдоним доступен в PSv3+)
Каталог был удалён между PUSHD и POPD POPD пытается перейти в несуществующую директорию Проверить существование каталога до POPD командой IF EXIST; предусмотреть обработку ошибки

Когда применять, а когда нет

POPD необходима в пакетных скриптах (.bat, .cmd), где нужно временно сменить рабочий каталог и гарантированно вернуться. Особенно полезна при работе с UNC-путями через PUSHD. Ограничение: стек существует только в рамках одного сеанса CMD — дочерние процессы и новые окна командной строки стека не наследуют. В PowerShell точный аналог — Pop-Location (псевдоним popd), который работает идентично, включая поддержку стека через Push-Location.

FAQ

Что будет, если вызвать POPD без предшествующего PUSHD?

Ничего: команда выполнится без ошибки, текущий каталог не изменится, ERRORLEVEL останется 0.

Сколько уровней стека поддерживает POPD?

Глубина стека ограничена доступной памятью и практически не ограничена для обычных сценариев. На практике используют 2–5 уровней.

Работает ли POPD с UNC-путями?

Да, если UNC-путь был добавлен через PUSHD — тот создаёт временную букву диска. POPD возвращается назад и автоматически удаляет этот временный диск.

Чем POPD в CMD отличается от Pop-Location в PowerShell?

Функционально они идентичны. В PowerShell Pop-Location — полноценный командлет с расширенными возможностями (несколько независимых стеков через параметр -StackName).

Можно ли использовать POPD внутри цикла FOR?

Да. Стек является общим для всего сеанса CMD, поэтому POPD внутри цикла сработает так же, как и вне его — извлечёт верхнюю запись из стека.

Как посмотреть содержимое стека PUSHD/POPD?

Встроенного способа просмотра стека нет. Для отладки добавляйте ECHO %CD% после каждого PUSHD и POPD, чтобы отслеживать текущий каталог.

Оцените статью
( Пока оценок нет )
MW10
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.