Skip to main content

How to Push and Pop Directories (PUSHD/POPD) in Batch Script

In batch scripting, it's a very common pattern to change the current directory, perform some actions, and then return to the original starting directory. The naive approach is to store the initial path in a variable (SET "START_DIR=%CD%") and then CD back to it at the end. This works, but it can be clumsy, especially if the script has multiple exit points.

A more elegant, powerful, and professional solution is to use the PUSHD and POPD commands. These commands manage a "stack" of directories, allowing you to bookmark your current location, jump to a new one, and then instantly return with a single command.

The Core Commands: PUSHD and POPD​

PUSHD and POPD are two commands that work together to manage directory navigation.

  • PUSHD "path": Push Directory. This command does two things at once:
    1. It "pushes" the current directory into a memory buffer, like putting a bookmark in a book.
    2. It then changes to the new directory specified in the path.
  • POPD: Pop Directory. This command retrieves the most recently pushed directory from the memory buffer and immediately changes back to it.

How the Directory "Stack" Works​

The memory buffer where PUSHD stores directories is a "stack," which means the last one in is the first one out. You can PUSHD multiple times to create a trail of breadcrumbs and then POPD multiple times to retrace your steps in reverse order.

  1. Start at C:\Users
  2. PUSHD C:\Windows -> Stack: [C:\Users]
  3. PUSHD C:\Logs -> Stack: [C:\Users, C:\Windows]
  4. Now you are in C:\Logs.
  5. POPD -> Returns you to C:\Windows. Stack: [C:\Users]
  6. POPD -> Returns you to C:\Users. Stack: [(empty)]

Basic Example: A Simple Detour and Return​

This script demonstrates the fundamental use case: go somewhere, do something, and come back.

@ECHO OFF
ECHO Starting in directory: %CD%
ECHO.

ECHO Changing to the Windows directory to find EXE files...
PUSHD C:\Windows

ECHO Now in directory: %CD%
DIR *.exe /B | FIND /C /V ""

ECHO.
ECHO Returning to the original directory...
POPD

ECHO Back in the starting directory: %CD%

Output:

Starting in directory: C:\Scripts

Changing to the Windows directory to find EXE files...
Now in directory: C:\Windows
214

Returning to the original directory...
Back in the starting directory: C:\Scripts

The script reliably returned to its starting point without ever needing to know what that starting point was.

PUSHD's Killer Feature: Changing Drive and Directory Automatically​

One of the best features of PUSHD is that it combines the functionality of CD /D. If you push to a path on a different drive, PUSHD will automatically change the drive letter for you, something a simple CD command cannot do without the /D switch.

The CD Problem​

C:\> CD D:\Data
C:\> <-- The drive did not change!

The PUSHD Solution​

C:\> PUSHD D:\Data
D:\Data> <-- The drive changed automatically!

This makes PUSHD a more powerful and convenient navigation tool than CD in almost every scripting scenario.

Common Pitfalls and How to Solve Them​

Forgetting to POPD​

If your script exits unexpectedly (due to an error or a GOTO) after a PUSHD but before the corresponding POPD, the user's command prompt will be left in the new directory.

Solution: The best practice is to enclose your PUSHD/POPD blocks within a SETLOCAL/ENDLOCAL pair. If the script ends for any reason, ENDLOCAL will automatically discard the directory changes made by PUSHD, returning the user to their original directory.

Handling Paths with Spaces​

As with all path-related commands in batch, if your target directory contains spaces, you must enclose it in double quotes.

Let's see the error in action:

REM This will FAIL.
PUSHD C:\Program Files

Solution: Always Quote Your Paths​

REM This is the correct, safe syntax.
PUSHD "C:\Program Files"

Using PUSHD without a Path​

If you run PUSHD with no arguments, it does not change the directory. Instead, it displays the current stack of stored directories. This can be a useful debugging tool to see what paths your script has saved.

Practical Example: A Script to Run a Build in Another Folder​

This script, located in a scripts folder, needs to navigate to the src folder to run a build command, then return to its starting point.

Consider this directory structure:

\MyProject\
+---dist\
+---scripts\
| build.bat
\---src\
build.bat
@ECHO OFF
SETLOCAL
ECHO --- Project Build Script ---
ECHO Starting from: %CD%
ECHO.

ECHO Entering source directory to compile...
PUSHD "..\src"

IF %ERRORLEVEL% NEQ 0 (
ECHO [ERROR] Could not find the source directory.
GOTO :End
)

ECHO Now in: %CD%
ECHO (Simulating a build command here...)
ECHO.

ECHO Returning to scripts directory...
POPD

ECHO Back in: %CD%
ECHO (Simulating a copy of build artifacts to the 'dist' folder...)

:End
ENDLOCAL
note

This script is clean and reliable. PUSHD and POPD handle all the navigation, ensuring the script's context is always correct without complex CD commands or storing %CD% in variables.

Conclusion​

PUSHD and POPD are the professional's choice for directory navigation in batch scripts. They provide a clean, reliable, and "stack-based" method for temporarily changing locations and returning safely.

Key advantages over using CD:

  • Reliable Return: POPD always takes you back to where you started, without needing to store the path in a variable.
  • Automatic Drive Change: PUSHD automatically handles changing drive letters, removing the need for CD /D.
  • Cleaner Code: Your script's logic becomes easier to read and less prone to path-related errors.

For any script that needs to do more than a simple, single directory change, adopting PUSHD and POPD will dramatically improve its robustness and maintainability.