Board logo

标题: [原创] 【续】[一日一教学](29)返回到上次路径:pushd/popd [打印本页]

作者: Hello123World    时间: 2011-9-8 16:44     标题: 【续】[一日一教学](29)返回到上次路径:pushd/popd

本帖最后由 Hello123World 于 2011-9-9 16:48 编辑

【原】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-2576-1-1.html
【续】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-13798-1-1.html


帮助信息:
  1. C:\Users\helloworld\Desktop>pushd /?
  2. 保存当前目录以供 POPD 命令使用,然后改到指定的目录。
  3. PUSHD [path | ..]
  4.   path        指定要成为当前目录的目录。
  5. 如果命令扩展被启用,除了一般驱动器号和路径,PUSHD
  6. 命令还接受网络路径。如果指定了网络路径,PUSHD 将创建一个
  7. 指向指定网络资源的临时驱动器号,然后再用刚定义的驱动器
  8. 号更改当前的驱动器和目录。可以从 Z: 往下分配临时驱动器
  9. 号,使用找到的第一个没有用过的驱动器号。
  10. C:\Users\helloworld\Desktop>popd/?
  11. 更改到 PUSHD 命令存储的目录。
  12. POPD
  13. 如果命令扩展被启用,从推目录堆栈 POPD 驱动器时,POPD
  14. 命令会删除 PUSHD 创建的临时驱动器号。
复制代码
命令概括:
pushd,全英文push directory,push意为:增加、入栈;这里可以引申为保存。
popd,全英文pop directory,pop意为:取出、抛出;这里取第一个意思即可。
path,全英文path,意为:道路、小路;计算机中一般引申为路径。

参数详解:

这里先从保存,即pushd说起。

pushd有两个参数。
例如:
  1. PUSHD [path | ..]
复制代码
保存当前目录以供 POPD 命令使用,然后改到指定的目录。

pushd path用来指定特定路径。
例如:
  1. C:\Users\helloworld\Desktop>pushd c:\hello
  2. c:\hello>pushd d:\
  3. d:\>
复制代码
可以看出,pushd在保存当前路径的同时,还具有跳转到指定路径的功能,从某种意义上等同于加强版的cd(跳驱动cd 还要加 /d参数呢);

用popd还原到原有路径。
例如:
  1. C:\Users\helloworld\Desktop>pushd c:\hello
  2. c:\hello>popd
  3. C:\Users\helloworld\Desktop>
复制代码
popd的瞬间还原,如果需要是在两个目录之间切换执行操作,这两命令就是至宝。

pushd .. 用来指定上层目录,学过cd ..的同学是可以很快理解的;
例如:
  1. C:\Users\helloworld\Desktop>pushd ..
  2. C:\Users\helloworld>
复制代码
效果:保存当前路径,并且跳转到上层路径。

用popd来还原。
例如:
  1. C:\Users\helloworld\Desktop>pushd ..
  2. C:\Users\helloworld>popd
  3. C:\Users\helloworld\Desktop>
复制代码
显示当前目录和指定目录的批处理。
例如:
  1. @echo off
  2. md c:\hello 2>nul
  3. pushd c:\hello
  4. dir
  5. popd
  6. dir
  7. pause>nul
复制代码
效果:
  1. 驱动器 C 中的卷是 System
  2. 卷的序列号是 441A-9B85
  3. c:\hello 的目录
  4. 2011/08/13  14:14    <DIR>          .
  5. 2011/08/13  14:14    <DIR>          ..
  6. 2011/08/24  12:16             1,297 1.txt
  7. 2011/07/23  14:52               544 2.txt
  8. 2011/07/22  13:49             4,649 a.TXT
  9. 2011/07/23  15:32             7,816 Batch external command.txt
  10. 2011/05/15  12:00             4,058 help.txt
  11. 2011/01/15  11:58             1,250 PPTV在线影视.lnk
  12. 2011/01/15  11:58             1,108 PP游戏世界.lnk
  13. 2011/08/13  14:13                76 test.bat
  14. 2011/07/09  12:47               425 test.txt
  15. 2011/05/29  16:02               613 win7 help比xp help多出来的命令.txt
  16. 2011/05/22  15:29             7,354 wmic.txt
  17. 2011/08/13  14:12    <DIR>          world
  18. 2011/01/13  16:05             1,087 WPS文字.lnk
  19. 2011/01/13  16:05             1,093 WPS演示.lnk
  20. 2011/01/13  16:05             1,082 WPS表格.lnk
  21. 2011/01/13  05:19               915 华军软件高速下载器 1.11 Beta.exe - 快捷方式.
  22. lnk
  23. 2010/12/14  23:28               637 咔咕.lnk
  24. 2011/08/13  14:14    <DIR>          新建文件夹
  25. 2010/12/20  22:42               616 热门游戏推荐.lnk
  26. 2010/12/06  23:33             1,850 爱酷2.1.lnk
  27. 2011/01/10  20:25               893 网络媒体播放器.lnk
  28. 2011/01/19  01:50             1,260 迅雷游戏-女生免单.lnk
  29. 2011/01/19  01:50             1,250 迅雷看看-免费高清影视.lnk
  30. 2011/01/06  01:54             1,240 迅雷看看-免费高清电影.lnk
  31. 2011/01/06  01:54             1,125 迅雷看看播放器.lnk
  32. 2011/01/19  01:50             2,727 迅雷软件中心.lnk
  33. 2010/12/20  22:42               620 酷狗音乐2010.lnk
  34. 2010/12/20  22:42               496 酷狗音乐文件夹.lnk
  35. 2011/02/06  16:37               920 飞秋FeiQ.exe - 快捷方式.lnk
  36.               27 个文件         47,001 字节
  37.                4 个目录  6,084,116,480 可用字节
  38. 驱动器 C 中的卷是 System
  39. 卷的序列号是 441A-9B85
  40. C:\Users\helloworld\Desktop 的目录
  41. 2011/09/08  16:15    <DIR>          .
  42. 2011/09/08  16:15    <DIR>          ..
  43. 2011/08/24  12:16               993 02.txt
  44. 2011/09/08  16:15             2,106 1.txt
  45. 2011/09/08  15:33                74 2.bat
  46. 2011/08/24  23:49               841 3.txt
  47. 2011/08/19  22:18             1,315 48个音标视屏提取器.bat
  48. 2011/09/08  11:57    <DIR>          520
  49. 2011/08/20  14:57               210 a.txt
  50. 2011/06/30  14:36             1,038 aboboo.lnk
  51. 2011/08/16  13:24           747,392 BaiduHelpBook.chm
  52. 2011/08/04  14:14               950 Batch external command.txt - 快捷方式.lnk
  53. 2011/08/27  15:29               299 clip.txt
  54. 2011/08/20  00:53                64 clip1.bat
  55. 2011/02/04  16:51               239 Google 翻译.url
  56. 2011/09/08  16:30                82 hello.bat
  57. 2011/09/01  12:21             4,036 help.txt
  58. 2011/01/02  12:14             1,207 HprSnap6.exe.lnk
  59. 2011/07/06  22:47             1,346 Internet Explorer.lnk
  60. 2011/09/07  18:56             4,631 MyRarHelp.txt
  61. 2011/06/30  01:13               649 QQ影音.lnk
  62. 2011/07/11  16:22               814 Script56.CHM - 快捷方式.lnk
  63. 2011/08/24  22:06               205 test.bat
  64. 2011/07/28  21:54               649 test.txt
  65. 2011/09/05  19:20               153 test.vbs
  66. 2009/09/21  23:24               845 VB6企业版.EXE.lnk
  67. 2011/08/13  22:41             2,296 Windows Live Writer.lnk
  68. 2011/08/25  09:51               147 两大搜索引擎集合器.bat
  69. 2010/11/21  04:22               948 傲游浏览器2.lnk
  70. 2010/12/31  15:14               506 司马懿.exe.lnk
  71. 2011/01/23  14:26             1,792 命令提示符.lnk
  72. 2011/09/02  10:15    <DIR>          娱乐
  73. 2011/07/31  22:37    <DIR>          安全工具
  74. 2011/01/11  09:35               404 快速设置“隐藏文件和文件夹”.bat
  75. 2011/05/10  11:52               589 方正同花顺.lnk
  76. 2011/08/22  23:39             1,270 标题违规.vbs
  77. 2011/05/10  11:52               484 湘财金禾独立交易版.lnk
  78. 2011/06/14  03:12               694 电驴.lnk
  79. 2011/08/20  20:33    <DIR>          编程
  80. 2011/06/24  13:17             1,777 腾讯QQ.lnk
  81. 2011/09/05  18:47               115 跳转到rar目录.bat
  82. 2011/08/19  17:33               118 非系统命令学习.bat
  83. 2011/02/08  20:42               586 黄金岛.lnk
  84.               38 个文件     16,022,395 字节
  85.                6 个目录  6,084,112,384 可用字节
复制代码
扩展阅读:
无。
作者: Batcher    时间: 2011-9-8 18:05

把全盘搜索作为扩展阅读或者例子可以吗?
http://bbs.bathome.net/thread-3465-1-1.html
作者: Hello123World    时间: 2011-9-8 20:31

回复 2# Batcher


    全盘搜索跟pushd和popd关系不大啊
作者: Batcher    时间: 2011-9-8 22:17

回复 3# Hello123World


仔细看看方案二
作者: Hello123World    时间: 2011-9-9 16:46

回复 4# Batcher
  1. @echo off
  2. rem 指定待搜索的文件
  3. set "FileName=BatHome_Batcher.txt"
  4. echo 正在搜索,请稍候...
  5. for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  6.   if exist %%a:\nul (
  7.     pushd %%a:\
  8.     for /r %%b in ("*%FileName%") do (
  9.       if /i "%%~nxb" equ "%FileName%" (
  10.         echo.%%b
  11.       )
  12.     )
  13.     popd
  14.   )
  15. )
  16. pause
复制代码
popd没有必要吧,在这里跳回源路径干什么?
作者: zzpsongs    时间: 2012-7-28 23:43

本帖最后由 zzpsongs 于 2012-8-6 15:06 编辑

我今天发现 pushd和popd指令还受变量延迟的影响
比如v目录的v.bat文件内的代码是
  1. pushd %~dp0
  2. md tesst1
  3. cd tesst1
  4. md tesst2
  5. cd tesst2
  6. setlocal enabledelayedexpansion
  7. cd \
  8. popd
  9. popd
  10. popd
  11. popd
复制代码
然后打开cmd,以v目录所在的目录为工作目录,对v\v.bat 进行call指令
  1. call v\v.bat
复制代码
可以看到,不管popd了几次,最终目录都会是setlocal前所cd的目录,而不是初衷的v目录所在的目录

解决办法是在popd之前进行endlocal,比如:
  1. pushd %~dp0
  2. md tesst1
  3. cd tesst1
  4. md tesst2
  5. cd tesst2
  6. setlocal enabledelayedexpansion
  7. cd \
  8. endlocal
  9. popd
  10. popd
  11. popd
  12. popd
复制代码
如果有错误,还请达人们指教~~

我上面的操作过程写得有点繁琐,我来个一次性的代码吧:
  1. @echo off
  2. set a=tess2
  3. echo 调用前的工作目录(初始目录)是%~dp0
  4. ::接下来配置实验环境,可无视
  5. md yy>nul 2>nul
  6. >show.txt echo 现在的工作目录是yy目录“%~dp0yy”,不是初始目录,请尝试修改%a%.bat,在popd前插入endlocal语句,保存后再重新执行本批处理
  7. move show.txt yy>nul
  8. >show.txt echo 现在的工作目录是初始目录”%~dp0”,现在popd的效果正是所预期的
  9. if not exist %a%.bat (
  10.   >%a%.bat (
  11.   echo pushd %%~dp0
  12.   echo cd yy
  13.   echo setlocal enabledelayedexpansion
  14.   echo.
  15.   echo popd
  16.   )
  17. )
  18. ::以上为实验环境配置,可无视
  19. echo 调用初始目录下的%a%.bat (pushd → cd yy → popd)
  20. call %a%.bat
  21. ::调用%a%.bat后,若显示初始目录,那就对了;若显示yy目录,那么popd就失去初衷了
  22. echo %a%.bat执行结束
  23. echo 调用结束后,执行type show.txt,结果是:
  24. echo.
  25. type show.txt
  26. echo.
  27. pause
复制代码

作者: Hello123World    时间: 2012-7-31 18:54

本帖最后由 Hello123World 于 2012-7-31 18:59 编辑

回复 6# zzpsongs


    受到变量延迟的影响?结果没看出差别。

1.
  1. @echo off
  2. pushd d:\
  3. dir
  4. cd game
  5. SetLocal EnableDelayedExpansion
  6. popd
  7. dir
  8. pause
复制代码
2.
  1. @echo off
  2. pushd d:\
  3. dir
  4. cd game
  5. popd
  6. dir
  7. pause
复制代码

作者: CrLf    时间: 2012-7-31 19:15

回复 6# zzpsongs


    popd 只和 pushd 一一对应(路径以堆栈的形式保存),测试你的代码发现 popd 后的路径仍是 pushd 前的路径啊,似乎和 setlocal 没有关系?
作者: zzpsongs    时间: 2012-8-6 13:12

本帖最后由 zzpsongs 于 2012-8-6 13:25 编辑

回复 7# Hello123World


    是这样的,你如果用cmd直接调用你的第一个代码,会发现在pause后(即是退出该批处理,或者说,在调用时,不要添加pause),目录会改变到setlocal 之前所设置的,而非原来调用该批处理的启动目录;
如果在popd前添加endlocal则可避免这种现象。
作者: zzpsongs    时间: 2012-8-6 13:14

回复 8# CrLf


    在下的意思是,如果不添加endlocal,popd的结果确实是启动目录,但是退出批处理后,目录却是setlocal之前所cd的。
作者: CrLf    时间: 2012-8-6 13:58

回复 10# zzpsongs


    还是没明白...
    不过发现 endlocal 居然会将路径还原到 setlocal 之前,从没听说过 setlocal 和 endlocal 还有这个特性
作者: zzpsongs    时间: 2012-8-6 14:28

本帖最后由 zzpsongs 于 2012-8-6 14:35 编辑

回复 11# CrLf


    是的,在下正是这个意思,也就是说,调用另一个批处理后要注意工作目录是否已被改变,而不是popd了,就放心了。

不过,这是什么道理呢?




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2