批处理命令–玩转目录之难兄难弟pushd&popd

#头条家时光#

上篇我们学习了robocopy的用法,来回顾下。主要是三个方面:
1.镜像:用于备份同步等,参数是/MIR(等同于/E /PURGE)或/PURGE,删除源文件中不再存在的目标文件和目录。一切与源文件同步,不同于源文件的删除,没有的拷贝(多删少补)。
2.移动文件或目录:参数/MOV仅仅移动文件,拷贝后删除源;参数/MOVE移动文件和目录,拷贝后删除源。
3.拷贝:参数许多,可以基于效率和用途看。追求效率和简洁,加/NFL /NS /NC /NP /MT:50,需要拷贝目录(含子目录),再加/S。
默认是拷贝所有的文件,若有同名文件会覆盖。如果只想拷贝新文件(比目标文件新),需加参数/XO,相当于XCOPY的/D参数。

下面来谈谈pushd&popd,第一还是看下语法。

批处理命令--玩转目录之难兄难弟pushd&popd

批处理命令--玩转目录之难兄难弟pushd&popd

估计看完后会一头雾水,这讲的是什么啊,完全不懂。不要着急,我们来看个例子(假设C盘Temp文件下有个名为IT的文件夹):

批处理命令--玩转目录之难兄难弟pushd&popd

你发现了什么,pushd这不就是之前的cd命令吗,popd执行后又回到原来的目录了。实则pushd和popd就像一对难兄难弟,一个负责开门,一个负责关门。

可能你又会问了,既然cd能实现这个功能,那用cd切换目录不香吗。那我告知你,有些方面用cd还真不行。当你想切换一个局域网目录时,你键入cd \***(此处省略N个路径字符),一行信息出目前你眼前:
CMD does not support UNC paths as current directories.又是UNC,之前的文章中我们讲过UNC路径就是类似于\的网络路径。

当使用命令扩展时(系统默认的功能)pushd排上用场了。你键入pushd \172.1.1.8public(如果有这么个路径),你发现怎么转到一个陌生的驱动器号上面去了。

这时,你打开资源管理器,这个驱动器被映射到刚刚那个网络目录了。转到cmd界面,你键入popd,神奇的事情又发生了,刚刚的映射又消失了。

原来pushd和popd是网络上的难兄难弟,一个负责开门,一个负责关门,果真名不虚传。知道了这2个命令,我们操作局域网内的文件就得心应手了。

当指定UNC网络路径时,PUSHD将创建一个临时驱动器映射,然后使用该新驱动器。临时驱动器号按相反的字母顺序分配,所以如果Z:空闲,它将第一被使用。

我们来捋一捋原理吧,第一讲讲什么是命令扩展(command extension)?

通俗来讲,命令扩展就是让你可以直接地从命令行运行TXT,DOCX或PNG等文件,并用正确的应用程序(记事本,Word,Photos)来打开它。
这取决于用户系统的文件类型与应用程序的关联。默认情况下,命令扩展是启用的。
如你只需要在CMD界面键入如33.txt,如果该路径下有这个文件,系统将默认用记事本打开这个文本文件。这就是命令扩展的作用。
回到主题,在命令扩展启用的情况下,pushd和popd可以以映射的方式开启或关闭局域网内的共享文件夹路径。
如果命令扩展被禁用,PUSHD命令将不再将临时驱动器映射到UNC路径,并且POPD将不会删除这些驱动器。

下面再讲下pushd和popd的运行原理。

pushd:存储当前目录供popd命令使用,然后切换到指定的目录。
每次使用pushd命令时,都会存储一个目录供您使用。但是,您可以通过多次使用pushd命令来存储多个目录。
这些目录按顺序存储在一个虚拟堆栈中,因此如果只使用一次pushd命令,则将在其中使用该命令的目录放在堆栈的底部。
如果再次使用该命令,第二个目录将放在第一个目录的顶部。每次使用pushd命令时,该过程都会重复。

popd:将目录更改回PUSHD命令最近存储的路径/文件夹(当前目录)。POPD还将删除PUSHD创建的任何临时驱动器映射。
如果使用popd命令,将删除堆栈顶部的目录,并将当前目录更改为该目录。
如果再次使用popd命令,将删除堆栈上的下一个目录。
如果启用了命令扩展,则popd命令将删除由pushd命令创建的任何驱动器号分配。

注意:PUSHD和POPD基于堆栈或LIFO(后进先出,last in, first out)原则操作,因此可以多次使用。

例子:
C:Program Files> PUSHD c:utils
C:utils> PUSHD c:Windows
C:Windows>
C:Windows> POPD
C:utils>
C:utils> POPD
C:Program Files>

值得注意的是使用pushd和popd时需要确认指定的目录或文件是否存在,尤其是用在UNC路径时,最好在前面加上判断语句,如if exist。
另外,如果当前目录(注意是目录,不是文件)被切换成功:%ERRORLEVEL% = 0,如果目录不存在或不可访问,或者给出了错误的开关:%ERRORLEVEL% = 1。

写在最后:
pushd和popd是一对很有用的命令,尤其是结合For语句,SED工具用于UNC路径下的文件批量更改。可达到“运筹帷幄,决胜千里之外”的感觉或效果。

© 版权声明

相关文章

暂无评论

none
暂无评论...