标题: [原创] 【续】[一日一教学](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
帮助信息:- C:\Users\helloworld\Desktop>pushd /?
- 保存当前目录以供 POPD 命令使用,然后改到指定的目录。
-
- PUSHD [path | ..]
-
- path 指定要成为当前目录的目录。
-
- 如果命令扩展被启用,除了一般驱动器号和路径,PUSHD
- 命令还接受网络路径。如果指定了网络路径,PUSHD 将创建一个
- 指向指定网络资源的临时驱动器号,然后再用刚定义的驱动器
- 号更改当前的驱动器和目录。可以从 Z: 往下分配临时驱动器
- 号,使用找到的第一个没有用过的驱动器号。
-
- C:\Users\helloworld\Desktop>popd/?
- 更改到 PUSHD 命令存储的目录。
-
- POPD
-
-
- 如果命令扩展被启用,从推目录堆栈 POPD 驱动器时,POPD
- 命令会删除 PUSHD 创建的临时驱动器号。
复制代码
命令概括:
pushd,全英文push directory,push意为:增加、入栈;这里可以引申为保存。
popd,全英文pop directory,pop意为:取出、抛出;这里取第一个意思即可。
path,全英文path,意为:道路、小路;计算机中一般引申为路径。
参数详解:
这里先从保存,即pushd说起。
pushd有两个参数。
例如:复制代码
保存当前目录以供 POPD 命令使用,然后改到指定的目录。
pushd path用来指定特定路径。
例如:- C:\Users\helloworld\Desktop>pushd c:\hello
-
- c:\hello>pushd d:\
-
- d:\>
复制代码
可以看出,pushd在保存当前路径的同时,还具有跳转到指定路径的功能,从某种意义上等同于加强版的cd(跳驱动cd 还要加 /d参数呢);
用popd还原到原有路径。
例如:- C:\Users\helloworld\Desktop>pushd c:\hello
-
- c:\hello>popd
-
- C:\Users\helloworld\Desktop>
复制代码
popd的瞬间还原,如果需要是在两个目录之间切换执行操作,这两命令就是至宝。
pushd .. 用来指定上层目录,学过cd ..的同学是可以很快理解的;
例如:- C:\Users\helloworld\Desktop>pushd ..
-
- C:\Users\helloworld>
复制代码
效果:保存当前路径,并且跳转到上层路径。
用popd来还原。
例如:- C:\Users\helloworld\Desktop>pushd ..
-
- C:\Users\helloworld>popd
-
- C:\Users\helloworld\Desktop>
复制代码
显示当前目录和指定目录的批处理。
例如:- @echo off
- md c:\hello 2>nul
- pushd c:\hello
- dir
- popd
- dir
- pause>nul
复制代码
效果:- 驱动器 C 中的卷是 System
- 卷的序列号是 441A-9B85
-
- c:\hello 的目录
-
- 2011/08/13 14:14 <DIR> .
- 2011/08/13 14:14 <DIR> ..
- 2011/08/24 12:16 1,297 1.txt
- 2011/07/23 14:52 544 2.txt
- 2011/07/22 13:49 4,649 a.TXT
- 2011/07/23 15:32 7,816 Batch external command.txt
- 2011/05/15 12:00 4,058 help.txt
- 2011/01/15 11:58 1,250 PPTV在线影视.lnk
- 2011/01/15 11:58 1,108 PP游戏世界.lnk
- 2011/08/13 14:13 76 test.bat
- 2011/07/09 12:47 425 test.txt
- 2011/05/29 16:02 613 win7 help比xp help多出来的命令.txt
- 2011/05/22 15:29 7,354 wmic.txt
- 2011/08/13 14:12 <DIR> world
- 2011/01/13 16:05 1,087 WPS文字.lnk
- 2011/01/13 16:05 1,093 WPS演示.lnk
- 2011/01/13 16:05 1,082 WPS表格.lnk
- 2011/01/13 05:19 915 华军软件高速下载器 1.11 Beta.exe - 快捷方式.
- lnk
- 2010/12/14 23:28 637 咔咕.lnk
- 2011/08/13 14:14 <DIR> 新建文件夹
- 2010/12/20 22:42 616 热门游戏推荐.lnk
- 2010/12/06 23:33 1,850 爱酷2.1.lnk
- 2011/01/10 20:25 893 网络媒体播放器.lnk
- 2011/01/19 01:50 1,260 迅雷游戏-女生免单.lnk
- 2011/01/19 01:50 1,250 迅雷看看-免费高清影视.lnk
- 2011/01/06 01:54 1,240 迅雷看看-免费高清电影.lnk
- 2011/01/06 01:54 1,125 迅雷看看播放器.lnk
- 2011/01/19 01:50 2,727 迅雷软件中心.lnk
- 2010/12/20 22:42 620 酷狗音乐2010.lnk
- 2010/12/20 22:42 496 酷狗音乐文件夹.lnk
- 2011/02/06 16:37 920 飞秋FeiQ.exe - 快捷方式.lnk
- 27 个文件 47,001 字节
- 4 个目录 6,084,116,480 可用字节
- 驱动器 C 中的卷是 System
- 卷的序列号是 441A-9B85
-
- C:\Users\helloworld\Desktop 的目录
-
- 2011/09/08 16:15 <DIR> .
- 2011/09/08 16:15 <DIR> ..
- 2011/08/24 12:16 993 02.txt
- 2011/09/08 16:15 2,106 1.txt
- 2011/09/08 15:33 74 2.bat
- 2011/08/24 23:49 841 3.txt
- 2011/08/19 22:18 1,315 48个音标视屏提取器.bat
- 2011/09/08 11:57 <DIR> 520
- 2011/08/20 14:57 210 a.txt
- 2011/06/30 14:36 1,038 aboboo.lnk
- 2011/08/16 13:24 747,392 BaiduHelpBook.chm
- 2011/08/04 14:14 950 Batch external command.txt - 快捷方式.lnk
- 2011/08/27 15:29 299 clip.txt
- 2011/08/20 00:53 64 clip1.bat
- 2011/02/04 16:51 239 Google 翻译.url
- 2011/09/08 16:30 82 hello.bat
- 2011/09/01 12:21 4,036 help.txt
- 2011/01/02 12:14 1,207 HprSnap6.exe.lnk
- 2011/07/06 22:47 1,346 Internet Explorer.lnk
- 2011/09/07 18:56 4,631 MyRarHelp.txt
- 2011/06/30 01:13 649 QQ影音.lnk
- 2011/07/11 16:22 814 Script56.CHM - 快捷方式.lnk
- 2011/08/24 22:06 205 test.bat
- 2011/07/28 21:54 649 test.txt
- 2011/09/05 19:20 153 test.vbs
- 2009/09/21 23:24 845 VB6企业版.EXE.lnk
- 2011/08/13 22:41 2,296 Windows Live Writer.lnk
- 2011/08/25 09:51 147 两大搜索引擎集合器.bat
- 2010/11/21 04:22 948 傲游浏览器2.lnk
- 2010/12/31 15:14 506 司马懿.exe.lnk
- 2011/01/23 14:26 1,792 命令提示符.lnk
- 2011/09/02 10:15 <DIR> 娱乐
- 2011/07/31 22:37 <DIR> 安全工具
- 2011/01/11 09:35 404 快速设置“隐藏文件和文件夹”.bat
- 2011/05/10 11:52 589 方正同花顺.lnk
- 2011/08/22 23:39 1,270 标题违规.vbs
- 2011/05/10 11:52 484 湘财金禾独立交易版.lnk
- 2011/06/14 03:12 694 电驴.lnk
- 2011/08/20 20:33 <DIR> 编程
- 2011/06/24 13:17 1,777 腾讯QQ.lnk
- 2011/09/05 18:47 115 跳转到rar目录.bat
- 2011/08/19 17:33 118 非系统命令学习.bat
- 2011/02/08 20:42 586 黄金岛.lnk
- 38 个文件 16,022,395 字节
- 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 - @echo off
- rem 指定待搜索的文件
- set "FileName=BatHome_Batcher.txt"
- echo 正在搜索,请稍候...
- 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 (
- if exist %%a:\nul (
- pushd %%a:\
- for /r %%b in ("*%FileName%") do (
- if /i "%%~nxb" equ "%FileName%" (
- echo.%%b
- )
- )
- popd
- )
- )
- pause
复制代码
popd没有必要吧,在这里跳回源路径干什么?
作者: zzpsongs 时间: 2012-7-28 23:43
本帖最后由 zzpsongs 于 2012-8-6 15:06 编辑
我今天发现 pushd和popd指令还受变量延迟的影响
比如v目录的v.bat文件内的代码是- pushd %~dp0
- md tesst1
- cd tesst1
- md tesst2
- cd tesst2
- setlocal enabledelayedexpansion
- cd \
- popd
- popd
- popd
- popd
复制代码
然后打开cmd,以v目录所在的目录为工作目录,对v\v.bat 进行call指令复制代码
可以看到,不管popd了几次,最终目录都会是setlocal前所cd的目录,而不是初衷的v目录所在的目录
解决办法是在popd之前进行endlocal,比如:- pushd %~dp0
- md tesst1
- cd tesst1
- md tesst2
- cd tesst2
- setlocal enabledelayedexpansion
- cd \
- endlocal
- popd
- popd
- popd
- popd
复制代码
如果有错误,还请达人们指教~~
我上面的操作过程写得有点繁琐,我来个一次性的代码吧:- @echo off
- set a=tess2
- echo 调用前的工作目录(初始目录)是%~dp0
- ::接下来配置实验环境,可无视
- md yy>nul 2>nul
- >show.txt echo 现在的工作目录是yy目录“%~dp0yy”,不是初始目录,请尝试修改%a%.bat,在popd前插入endlocal语句,保存后再重新执行本批处理
- move show.txt yy>nul
- >show.txt echo 现在的工作目录是初始目录”%~dp0”,现在popd的效果正是所预期的
- if not exist %a%.bat (
- >%a%.bat (
- echo pushd %%~dp0
- echo cd yy
- echo setlocal enabledelayedexpansion
- echo.
- echo popd
- )
- )
- ::以上为实验环境配置,可无视
- echo 调用初始目录下的%a%.bat (pushd → cd yy → popd)
- call %a%.bat
- ::调用%a%.bat后,若显示初始目录,那就对了;若显示yy目录,那么popd就失去初衷了
- echo %a%.bat执行结束
- echo 调用结束后,执行type show.txt,结果是:
- echo.
- type show.txt
- echo.
- pause
复制代码
作者: Hello123World 时间: 2012-7-31 18:54
本帖最后由 Hello123World 于 2012-7-31 18:59 编辑
回复 6# zzpsongs
受到变量延迟的影响?结果没看出差别。
1.- @echo off
- pushd d:\
- dir
- cd game
- SetLocal EnableDelayedExpansion
- popd
- dir
- pause
复制代码
2.- @echo off
- pushd d:\
- dir
- cd game
- popd
- dir
- 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 |