POPD извлекает верхний элемент из стека каталогов, сформированного командой PUSHD, и немедленно переходит в него. Команда применяется в пакетных скриптах, когда нужно временно сменить рабочий каталог, выполнить операции и гарантированно вернуться в исходную директорию.
- Синтаксис команды POPD
- Ключи и параметры
- Примеры использования
- Базовый возврат в предыдущий каталог
- Вложенный стек из нескольких каталогов
- Использование в bat-скрипте для изоляции рабочего каталога
- Переход на сетевой ресурс через PUSHD и возврат через POPD
- Проверка, пуст ли стек
- Сброс всего стека в конце скрипта
- Частые ошибки и решения
- Когда применять, а когда нет
- FAQ
- Что будет, если вызвать POPD без предшествующего PUSHD?
- Сколько уровней стека поддерживает POPD?
- Работает ли POPD с UNC-путями?
- Чем POPD в CMD отличается от Pop-Location в PowerShell?
- Можно ли использовать POPD внутри цикла FOR?
- Как посмотреть содержимое стека PUSHD/POPD?
Синтаксис команды 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, чтобы отслеживать текущий каталог.


