| 
          @echo off | 
        
        
           | 
          rem *********************************************************************** | 
        
        
           | 
          rem This file is provided under MIT License: | 
        
        
           | 
          rem http://www.opensource.org/licenses/mit-license.phprem  | 
        
        
           | 
          rem | 
        
        
           | 
          rem This batch file is a extended cd command. | 
        
        
           | 
          rem This could save the history and also jump in the histories.  | 
        
        
           | 
          rem For detail help, type <filename> /? | 
        
        
           | 
          rem | 
        
        
           | 
          rem Author: Programus ([email protected]) | 
        
        
           | 
          rem gist url:  | 
        
        
           | 
          rem https://gist.github.com/programus/2d2738b2a746140186f7738b678bdcec | 
        
        
           | 
          rem | 
        
        
           | 
          rem this tool need or create 2 temporary files:  | 
        
        
           | 
          rem   %BASEDIR%\dir-list.tmp | 
        
        
           | 
          rem   %BASEDIR%\dir-prev.tmp | 
        
        
           | 
          rem *********************************************************************** | 
        
        
           | 
          
 | 
        
        
           | 
          set BASEDIR=%USERPROFILE% | 
        
        
           | 
          
 | 
        
        
           | 
          if /i [%1]==[/help] goto :printhelp | 
        
        
           | 
          if /i [%1]==[/h] goto :printhelp | 
        
        
           | 
          if [%1]==[/?] goto :printhelp | 
        
        
           | 
          
 | 
        
        
           | 
          goto :main | 
        
        
           | 
          
 | 
        
        
           | 
          :printhelp | 
        
        
           | 
          echo %~n0                 - display all saved path with leading id and name followed if any | 
        
        
           | 
          echo %~n0 ^<path^>          - save current path and jump to ^<path^> | 
        
        
           | 
          echo %~n0 :^<n^|name^>       - jump to the Nth or named path in the saved list | 
        
        
           | 
          echo %~n0 :               - jump to previous path | 
        
        
           | 
          echo %~n0 name ^<n^>:^<name^> - name the Nth path as ^<name^> | 
        
        
           | 
          echo %~n0 rm [:]^<n^|name^>  - remove the Nth or named path from the list | 
        
        
           | 
          echo %~n0 clear           - clear the list | 
        
        
           | 
          echo %~n0 /help           - print out this help | 
        
        
           | 
          echo %~n0 /?              - same as above | 
        
        
           | 
          
 | 
        
        
           | 
          goto :allover | 
        
        
           | 
          
 | 
        
        
           | 
          :main | 
        
        
           | 
          setlocal EnableDelayedExpansion | 
        
        
           | 
          
 | 
        
        
           | 
          set tp=%BASEDIR%\dir-prev.tmp | 
        
        
           | 
          set tf=%BASEDIR%\dir-list.tmp | 
        
        
           | 
          
 | 
        
        
           | 
          rem extract previous path | 
        
        
           | 
          set /p ppth=<%tp% | 
        
        
           | 
          
 | 
        
        
           | 
          rem read list from file | 
        
        
           | 
          set len=0 | 
        
        
           | 
          for /f "tokens=*" %%p in (%tf%) do ( | 
        
        
           | 
            set /a "len+=1" | 
        
        
           | 
            set lines[!len!]=%%p | 
        
        
           | 
            for /f "tokens=1,2 delims=;" %%a in ("%%p") do set pp=%%a&set nn=%%b | 
        
        
           | 
            set list[!len!]=!pp! | 
        
        
           | 
            set list[!nn!]=!pp! | 
        
        
           | 
            set names[!len!]=!nn! | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          rem list all history | 
        
        
           | 
          if [%1]==[] ( | 
        
        
           | 
            for /l %%i in (1,1,%len%) do ( | 
        
        
           | 
              set nm= | 
        
        
           | 
              if not "!names[%%i]!"=="" set nm=   ^<--^<^<^<^ (!names[%%i]!^) | 
        
        
           | 
              echo [%%i] !list[%%i]!!nm! | 
        
        
           | 
            ) | 
        
        
           | 
            goto :end | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          rem goto previous directory and store current | 
        
        
           | 
          if [%1]==[:] ( | 
        
        
           | 
            rem get the previous path | 
        
        
           | 
            set pth="%ppth%" | 
        
        
           | 
            set pth=!pth:"=! | 
        
        
           | 
            goto :savecd | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          rem clear all | 
        
        
           | 
          if /i [%1]==[clear] ( | 
        
        
           | 
            set len=0 | 
        
        
           | 
            goto :write | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          rem name an item | 
        
        
           | 
          if /i [%1]==[name] ( | 
        
        
           | 
            for /f "tokens=1,2 delims=:" %%a in ("%2") do set no=%%a&set name=%%b | 
        
        
           | 
            if not "!name!"=="" ( | 
        
        
           | 
              set notNumeric= | 
        
        
           | 
              for /f "delims=0123456789" %%x in ("!name!") do set notNumeric=%%x | 
        
        
           | 
              if not defined notNumeric ( | 
        
        
           | 
                echo Error: name cannot be a number. | 
        
        
           | 
                goto :allover | 
        
        
           | 
              ) | 
        
        
           | 
              for /l %%i in (1,1,%len%) do ( | 
        
        
           | 
                set nm=!names[%%i]! | 
        
        
           | 
                if "!nm!"=="!name!" ( | 
        
        
           | 
                  echo Error: name has been existed. | 
        
        
           | 
                  goto :allover | 
        
        
           | 
                ) | 
        
        
           | 
              ) | 
        
        
           | 
            ) | 
        
        
           | 
            set names[!no!]=!name! | 
        
        
           | 
            goto :write | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          rem mark index should be removed | 
        
        
           | 
          if /i [%1]==[rm] ( | 
        
        
           | 
            set rmno=%2 | 
        
        
           | 
            rem check names which is a non-numeric | 
        
        
           | 
            set notNumeric= | 
        
        
           | 
            for /f "delims=0123456789" %%x in ("%rmno%") do set notNumeric=%%x | 
        
        
           | 
            if not defined notNumeric ( | 
        
        
           | 
              rem parameter is a name, find out the index | 
        
        
           | 
              for /l %%i in (1,1,%len%) do ( | 
        
        
           | 
                set nm=!names[%%i]! | 
        
        
           | 
                if "!nm!"=="!rmno!" ( | 
        
        
           | 
                  set rmno=%%i | 
        
        
           | 
                  goto :endloopname | 
        
        
           | 
                ) | 
        
        
           | 
              ) | 
        
        
           | 
            ) | 
        
        
           | 
          :endloopname | 
        
        
           | 
            goto :write | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          rem other cases | 
        
        
           | 
          rem store the argument as path | 
        
        
           | 
          set pth=%1 | 
        
        
           | 
          rem remove all double-quotation | 
        
        
           | 
          set pth=%pth:"=% | 
        
        
           | 
          if [%pth:~0,1%]==[:] ( | 
        
        
           | 
            rem start with ':', mean jump to a history record | 
        
        
           | 
            rem get the real path | 
        
        
           | 
            set pth=!list[%pth::=%]! | 
        
        
           | 
          ) | 
        
        
           | 
          :savecd | 
        
        
           | 
          rem store current path into history | 
        
        
           | 
          set /a "len+=1" | 
        
        
           | 
          set list[!len!]=%cd% | 
        
        
           | 
          set lines[!len!]=%cd% | 
        
        
           | 
          
 | 
        
        
           | 
          :write | 
        
        
           | 
          rem write back to file | 
        
        
           | 
          echo off | 
        
        
           | 
          set j=0 | 
        
        
           | 
          (for /l %%i in (1,1,%len%) do ( | 
        
        
           | 
            rem do not save rm directory | 
        
        
           | 
            if not [%%i]==[%rmno::=%] ( | 
        
        
           | 
              set pt=!list[%%i]! | 
        
        
           | 
              rem find out whether current directory is written already | 
        
        
           | 
              for /l %%k in (0,1,!j!) do ( | 
        
        
           | 
                if /i "!pt!"=="!written[%%k]!" ( | 
        
        
           | 
                  rem if it is written already, mark as included | 
        
        
           | 
                  set included=T | 
        
        
           | 
                ) | 
        
        
           | 
              ) | 
        
        
           | 
              if not "!included!"=="T" ( | 
        
        
           | 
                rem only write the directory if it is not written already, not included. | 
        
        
           | 
                echo !pt!;!names[%%i]! | 
        
        
           | 
                rem mark the directory as written | 
        
        
           | 
                set /a "j+=1" | 
        
        
           | 
                set written[!j!]=!pt! | 
        
        
           | 
              ) | 
        
        
           | 
            ) | 
        
        
           | 
          )) > %tf% | 
        
        
           | 
          
 | 
        
        
           | 
          rem save current path as previous path | 
        
        
           | 
          if /i not "%pth%"=="%cd%" ( | 
        
        
           | 
            if defined pth ( | 
        
        
           | 
              call :printcd "%tp%" | 
        
        
           | 
            ) | 
        
        
           | 
          ) | 
        
        
           | 
          :end | 
        
        
           | 
          endlocal && set __pth=%pth% | 
        
        
           | 
          
 | 
        
        
           | 
          rem change directory | 
        
        
           | 
          if defined __pth ( | 
        
        
           | 
            cd /d "%__pth%" | 
        
        
           | 
            set __pth= | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          :allover | 
        
        
           | 
          exit /b 0 | 
        
        
           | 
          
 | 
        
        
           | 
          :printcd | 
        
        
           | 
          echo %cd%>%1 | 
        
        
           | 
          exit /b 0 |