windowsbatch-filepushd

pushd not working in a batch file with delayed expansion


I have read many questions and answers about pushd here and on other sites, the overwhelming majority of them referring to issues with UNC paths. However, I've got a different problem I haven't seen a single hint about.

Using Windows 10 x64 Enterprise (Version 1809), I am executing the following batch file from within a console window:

@echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
pushd %DestDir%

My problem is that pushd seems to be executed in the wrong way or not at all. That means that I am not in c:\windows when the batch file has been run, but still in the directory I was in before running it.

I have tried several things in a desperate attempt to understand the problem (knowing that those tests didn't make sense):

However, when I do not turn on delayed expansion, pushd works as expected. In other words, after having run the following batch file

@echo off
set DestDir=c:\windows
pushd %DestDir%

I indeed have been beamed into c:\windows regardless of the directory I have been in before running the batch file.

I suppose that I am quite silly at the moment, but I can't wrap my head around this for the life of me. So could anybody please explain why pushd fails if delayed expansion is active?


Solution

  • The reason for your problem was already discussed in the comments, but there was no solution so far.
    You can overcome the issue by an explicit endlocal:

    REM @echo off
    setLocal EnableDelayedExpansion
    set DestDir=c:\windows
    endlocal & pushd %DestDir%
    

    The last line is parsed in one go, so %DestDir% is replaced to its value (before endlocal) before executing the whole line (run with echo on to watch).