中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-07-04 16:15
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » (已结)请问如何使得批处理执行完后自动返回之前的目录? 查看 1,715 回复 9
楼 主 (已结)请问如何使得批处理执行完后自动返回之前的目录? 发表于 2005-10-28 18:21 ·  中国 广东 肇庆 怀集县 电信
中级用户
★★
积分 384
发帖 189
注册 2005-10-19 13:12
20年会员
UID 43709
性别 男
状态 离线
运行环境:Win2000

我的目的是想让批处理执行完后自动返回之前的目录准备执行下一个批处理.

可有什么办法实现?

是否可以在批处理执行时把当前路径设置成变量,而后调用??

该执行该如何实现??

注:非不得已的情况下,请不要使用外部工具.

------------------------------
以下是chenhui530兄所给出的解决方案
(原贴地址:http://www.cn-dos.net/forum/viewthread.php?tid=15228&fpage=1)


set a="%cd%"
for %%a in (%a%) do set b=%%~da
for %%b in (%a%) do set c=%%~npb
::你切换盘符后运行的代码
...
::你需要返回源路径的代码
%b%
cd\
cd %c%


现有一点不明白:

set b=%%~da
set c=%%~npb


中的danpb是什么意思??

我把它替换成其它的字母后发现无法返回之前的目录了.

请各位高手指点一二.

[ Last edited by voiL on 2005-11-2 at 14:38 ]
2 发表于 2005-10-28 19:38 ·  中国 上海 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
3 发表于 2005-10-28 21:23 ·  中国 广东 肇庆 怀集县 电信
中级用户
★★
积分 384
发帖 189
注册 2005-10-19 13:12
20年会员
UID 43709
性别 男
状态 离线
谢谢DOSforever和tigerpower两位兄弟.

两种方法我先试试,如有问题再另行请教.

谢!
4 发表于 2005-10-30 11:55 ·  中国 广东 肇庆 电信
中级用户
★★
积分 384
发帖 189
注册 2005-10-19 13:12
20年会员
UID 43709
性别 男
状态 离线
对于2楼DOSforever兄给出的资料,我试了一下,XP下确实可行.

但还有一点小问题需要请教一下.(写在1楼)
5 发表于 2005-10-30 12:27 ·  中国 福建 三明 电信
中级用户
★★
积分 316
发帖 83
注册 2005-03-01 00:00
21年会员
UID 36626
性别 男
状态 离线
set b=%%~da 用变量b来保存驱动器号
set c=%%~npb用变量c来保存和文件名

不过如果只是保存目录应该只要set c=%%~pb不用%%~npb吧
6 FOR 变量参照的替换增强 发表于 2005-10-30 12:30 ·  中国 福建 三明 电信
中级用户
★★
积分 316
发帖 83
注册 2005-03-01 00:00
21年会员
UID 36626
性别 男
状态 离线
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~pI - 仅将 %I 扩充到一个路径
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~zI - 将 %I 扩充到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩充到
空字符串

组合修饰符来得到多重结果:

%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
7 发表于 2005-10-30 14:47 ·  中国 广东 肇庆 四会市 电信
中级用户
★★
积分 384
发帖 189
注册 2005-10-19 13:12
20年会员
UID 43709
性别 男
状态 离线
理解了,感谢smileseeker兄弟.
8 发表于 2005-10-30 15:12 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re smileseeker:

%%~npb 中的 n 是必要的,否则就会替换成上一级目录的路径,而且就现在的使用状况来看,表示扩展名的 x 也是需要的,如 %%~pnxb ,否则就会无法正确替换名字中包含句点的目录。

Re chenhui530:

兄的方案可以略作更新:


for %%p in (%cd%) do set _retcmd=%%~dp ^&^& cd %%~pnxp
::你切换盘符和路径后运行的代码
:: ...
%_retcmd%
set _retcmd=
::你需要返回源路径的代码


当然,更简单的方法是直接保存原来的当前路径,在想返回时用 cd /d 这个命令即可。


set _oldpath=%cd%
::你切换盘符和路径后运行的代码
:: ...
cd /d %_oldpath%
::你需要返回源路径的代码


需要注明的是,上述方法仅适用于 NT CMD 环境,在 MSDOS6/7 和 Win9x 命令行都是无效的。而在 NT CMD 环境下,使用 tigerpower 兄提到的 pushd/popd 是最简单实用的方案,上述的方案只是在某些特殊情况下才会使用到。另外,在MSDOS 和Win9x 命令行环境下,也早已出现许多类似 pushd/popd 功能的第三方支持工具,如果找不到这些工具,那可以参考2楼链接中我所写的程序,其中利用了内部命令 prompt 。

[ Last edited by willsort on 2005-10-30 at 15:14 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
9 发表于 2005-10-30 18:19 ·  中国 福建 三明 电信
中级用户
★★
积分 316
发帖 83
注册 2005-03-01 00:00
21年会员
UID 36626
性别 男
状态 离线
willsort兄的回帖就是能让兄弟们学到很多东西

以前只知道才cd\和cd 路径 不知道还有cd /d 哈哈

不过小弟还有一个问题

为什么当路径中有"."时

%~npi就不会替换到原来的路径

而只是 路径中"."之前的一部分
10 发表于 2005-10-30 19:19 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re smileseeker:

在微软的操作系统中(包括DOS和Windows),文件名或者目录名中的最后一个 "." 是主文件名和扩展名的分隔符,因为%~npi 没有指定替换扩展名,因此 "." 以及其后的扩展名被省略。

因为在早期的系统应用中,目录名中很少带有扩展名,所以 %~npi 的用法在大多数情况下可以正常工作,但是随着长文件名的出现和网络的广泛应用,目录名中带有句点的情形大量出现,尽管句点后的文字大多数不是作为扩展名来应用的,但是我们在编程实践中,仍然需要按照系统的规则来进行,排除我们所能预测到各种各样的例外情况,以增强程序的健壮性。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
论坛跳转: