返回列表 发帖

[原创] 【续】[一日一教学](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 创建的临时驱动器号。COPY
命令概括:
pushd,全英文push directory,push意为:增加、入栈;这里可以引申为保存。
popd,全英文pop directory,pop意为:取出、抛出;这里取第一个意思即可。
path,全英文path,意为:道路、小路;计算机中一般引申为路径。

参数详解:

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

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

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

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

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

用popd来还原。
例如:
C:\Users\helloworld\Desktop>pushd ..
C:\Users\helloworld>popd
C:\Users\helloworld\Desktop>COPY
显示当前目录和指定目录的批处理。
例如:
@echo off
md c:\hello 2>nul
pushd c:\hello
dir
popd
dir
pause>nulCOPY
效果:
驱动器 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 可用字节COPY
扩展阅读:
无。

把全盘搜索作为扩展阅读或者例子可以吗?
http://bbs.bathome.net/thread-3465-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# Batcher


    全盘搜索跟pushd和popd关系不大啊

TOP

回复 3# Hello123World


仔细看看方案二
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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
  )
)
pauseCOPY
popd没有必要吧,在这里跳回源路径干什么?

TOP

本帖最后由 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
popdCOPY
然后打开cmd,以v目录所在的目录为工作目录,对v\v.bat 进行call指令
call v\v.batCOPY
可以看到,不管popd了几次,最终目录都会是setlocal前所cd的目录,而不是初衷的v目录所在的目录

解决办法是在popd之前进行endlocal,比如:
pushd %~dp0
md tesst1
cd tesst1
md tesst2
cd tesst2
setlocal enabledelayedexpansion
cd \
endlocal
popd
popd
popd
popdCOPY
如果有错误,还请达人们指教~~

我上面的操作过程写得有点繁琐,我来个一次性的代码吧:
@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 (pushdcd yy → popd)
call %a%.bat
::调用%a%.bat后,若显示初始目录,那就对了;若显示yy目录,那么popd就失去初衷了
echo %a%.bat执行结束
echo 调用结束后,执行type show.txt,结果是:
echo.
type show.txt
echo.
pauseCOPY
1

评分人数

    • CrLf: 新发现技术 + 1

TOP

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

回复 6# zzpsongs


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

1.
@echo off
pushd d:\
dir
cd game
SetLocal EnableDelayedExpansion
popd
dir
pauseCOPY
2.
@echo off
pushd d:\
dir
cd game
popd
dir
pauseCOPY

TOP

回复 6# zzpsongs


    popd 只和 pushd 一一对应(路径以堆栈的形式保存),测试你的代码发现 popd 后的路径仍是 pushd 前的路径啊,似乎和 setlocal 没有关系?

TOP

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

回复 7# Hello123World


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

TOP

回复 8# CrLf


    在下的意思是,如果不添加endlocal,popd的结果确实是启动目录,但是退出批处理后,目录却是setlocal之前所cd的。

TOP

回复 10# zzpsongs


    还是没明白...
    不过发现 endlocal 居然会将路径还原到 setlocal 之前,从没听说过 setlocal 和 endlocal 还有这个特性

TOP

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

回复 11# CrLf


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

不过,这是什么道理呢?

TOP

返回列表