Mäx
Mäx

Reputation: 48

MS-Win-CMD PushD/PopD how it work and why not in a "For /f"-Loop

After I faild again and again to find the answer I wrote these Script:

<!-- : first Line of "JustPopdBack.cmd"-Script (a CMD+Script for Windows)
@echo off %debug%
setLocal enableExtensions

::    Copyleft 2017 Markus Merkle (aka Mäx) - Licence: GNU-GPLv3
::  ----------------------------------------------------------------------------
::  Cause it seems stupid to make a short Script long just for Right
::  of the Author, so the Licence-Text is not embeded in this Script.
::  !!! Please have a look on <http://www.gnu.org/licenses/>
::      if you still don't know the GNU-GPLv3.
::  ----------------------------------------------------------------------------
::   This is just a free and open TestScript
::   Feel free to used or modify but please mark this work (how as done).
:: -----------------------------------------------------------------------------
 title JustPopdBack-Test
 color 0a                                 %= cause I like LightGreen on Black =%
 echo.
 echo. Just a Test-Script for PushD and PopD Command
 echo.
 echo. To use it please Enter some Directorys first
 echo. Don't shy to use diffrent Drives (C:\ or D:\ etc. )
 echo. ...and feel free to use the TAB-Key then...
 echo. Lets PushD in this Dir and after just Enter Nothing Popd out.
::******************************************************************************
 :dLoop for UserQuest and Pushd in
 echo.
 set "NxtDir="
 set /P "NxtDir=NextDir? :\> "
 if defined NxtDir (PushD %NxtDir% & goTo dLoop)
::------------------------------------------------------------------------------
 echo.
 echo. Lets see the PushD History
 pushD
 echo. now try again with "For /F"-Loop a PopD Back.
 for /f %%a in ('pushD') do (echo %%a && PopD)
 echo.
 echo This don't work - did you know why?
 timeOut -1
:*******************************************************************************
 :PopDback that will work
 PopD && Echo. Uh I PopD'd - let's'ee PushD now: && PushD && goTo PopDback
 :: but I don't like that - can you help to make me happy ?
 --------------------------------------------------------------------------------
 timeout -1
 color
 exit /b                                        %= That the End of this Script =%
 ::       Thnx to all my Teachers 
 ::    ...but the realy ones not the called & most have just 60 Minutes for me...

I hope you see why I wrote this Script and also hope all you like to give me many comments so we can find out what is going wrong here and maybe there ... (hey not in my Head - I hope :-)

My Targed of this Post is a Working of

for /f %a in ('PushD') do PopD

Upvotes: 2

Views: 2574

Answers (2)

Aacini
Aacini

Reputation: 67216

This method works in the way to used in your code, with a for /f loop:

@echo off
setlocal

pushd C:\windows\
pushd c:\windows\system32

pushd > "%tmp%\pushd.txt"
for /f "usebackq delims=" %%a in ("%tmp%\pushd.txt") do (echo %%a & PopD)

Upvotes: 1

jeb
jeb

Reputation: 82287

A for /F starts the command in a new cmd.exe context.
Therefore the pushd is executed there and then the context will be closed.
The pushd in the new cmd.exe doesn't affect the parent context at all.
Therefore the popd doesn't revert the pushd.

If you only want to popd all pushd's you could use a loop

@echo off
setlocal EnableDelayedExpansion
pushd C:\windows\
pushd c:\windows\system32

:popd_all
echo #: !cd!
popd && goto popd_all

Upvotes: 4

Related Questions