Board logo

标题: 批处理如何获取当前所在路径信息 [打印本页]

作者: darkpiggy     时间: 2005-3-2 00:00    标题: 批处理如何获取当前所在路径信息


各位老大,有问题求教!

是这样的一个问题,比如我先要保存当前的路径,然后切换路径到A盘执行命令,执行完毕后

我需要将路径切换到刚才我保存到的路径,这个批处理该如何写啊?

请各位老大帮帮忙,谢谢啊!
作者: chenhui530     时间: 2005-3-2 00:00
论坛最近不知道为什么很不稳定啊!刚才我写了很详细的一大片没发成功!现在重新给你发来
下次你在求助发帖的时候首先要说明运行环境.还有条件比如说在你知道源路径的情况下直接输入源路径所在的盘就能回到源路径.但是在不知道源路径的情况下,也就是在批处理中执行的时候,如果是NT以上的操作系统的话可以使用下面代码:set a="%cd%"
for %%a in (%a%) do set b=%%~da
for %%b in (%a%) do set c=%%~npb
::你切换盘符后运行的代码
...
::你需要返回源路径的代码
%b%
cd\
cd %c%

如果是在纯DOS或者是在98的DOS下的话可以使用第三放工具strings.com在本论坛软件站可以下载到.由于本人还有事情不能切换到DOS下给你求证.所以给你strings.com的一些用法希望对你有用,自己也动动手也好.1.STRINGS [目标变量=]LEFT 源字符串 要取的字符数量  〈从左边取源字符串的指定字符数量〉
2.STRINGS [目标变量=]RIGHT 源字符串 要取的字符数量 〈从右边取源字符串的指定字符数量〉
3.STRINGS [目标变量=]MID 源字符串 起止数,终止数     〈从中央取源字符串〉
4.STRINGS [目标变量=]LENGTH 源字符串        〈返回源字符串的字符长度〉         
5.STRINGS [目标变量=]FIND 源字符串 字符     〈从源字符中查找指定的字符〉
6.STRINGS [目标变量=]FINDC 源字符串 字符    〈从源字符中查找指定的字符,区分大小写〉
7.STRINGS [目标变量=]LOWER 源字符串       〈将源字符串中的大写字母转换成小写字母〉
8.STRINGS [目标变量=]UPPER 源字符串       〈将源字符串中的小写字母转换成大写字母〉
9.STRINGS [目标变量=]CHAR 字符 [字符1] [字符2]... 〈将字符转换成ASCII数字〉
10、STRINGS [目标变量=]VAL 数字 [数字1] [数字2]...  〈将数字转换成ASCII字符〉
11、STRINGS [目标变量=]FILEDRIVE 文件名             〈返回文件名所在的盘符〉
12、STRINGS [目标变量=]FILEDIR 文件名               〈返回文件名所在的目录〉
13、STRINGS [目标变量=]FILENAME 源文件名    〈返回源文件名的文件名,不要扩展名〉
14、STRINGS [目标变量=]FILEEXT  源文件名     〈只返回源文件名的扩展名〉
15、STRINGS [目标变量=]ADDCOMMAS 数字    〈将数字每隔三位用逗号隔开〉
16、STRINGS [目标变量=]REPEAT 重复多少,字符或数字 〈将字符或数字进行指定的重复〉
17、STRINGS [目标变量=]READ 文件名,行数           〈读取文件中指定行数的内容〉
18、STRINGS [目标变量=]WRITE 文件名,字符          〈将字符追加到文件中〉
19、STRINGS [目标变量=]FILESIZE 文件名            〈返回文件的大小〉
20、STRINGS [目标变量=]LINESIZE 文件名            〈返回文件内容的总行数〉
21、STRINGS [目标变量=]TRUENAME 文件名            〈返回文件的完整路径〉
22、STRINGS [目标变量=]FILEDATE 文件名            〈返回文件的修改日期〉
23、STRINGS [目标变量=]FILETIME 文件名            〈返回文件的修改时间〉
24、STRINGS [目标变量=]VER                        〈返回当前系统的DOS版本号〉
25、STRINGS [目标变量=]ASK 提未字符串[,最大输入数][,1=*显示 2=不显示] 〈对话〉
26、STRINGS [目标变量=]INWIN            〈如果在WINDOWS中的DOS窗口中运行则返回1〉
27、STRINGS [目标变量=]ENVFREE     〈返回环境变量空间的空闲字节数〉
28、STRINGS [目标变量=]ENVSIZE       〈返回环境变量空间的总共大小〉
29、STRINGS [目标变量=]TRUEVER      〈返回当前DOS的真实版本号〉
30、STRINGS [目标变量=]FILES            〈返回当前同时访问的文件数量〉
31、STRINGS [目标变量=]LASTDRIVE    〈返回当前系统可以访问最后有效的驱动器字母〉
32、STRINGS [目标变量=]CODEPAGE   〈返回当前系统活动的长文件代码页〉
33、STRINGS [目标变量=]COUNTRY      〈返回当前系统设置的国家代码〉
34、STRINGS [目标变量=]BIOSDATE     〈返回BIOS出厂的日期〉
35、STRINGS [目标变量=]GETKEY        〈返回按键的ASCII代码〉
36、STRINGS [目标变量=]ADD 数字1,数字2[,数字3]...  〈对数字进行+运算〉
37、STRINGS [目标变量=]SUB 数字1,数字2[,数字3]...  〈对数字进行-运算〉
38、STRINGS [目标变量=]MUL 数字1,数字2[,数字3]...  〈对数字进行×运算〉
39、STRINGS [目标变量=]DIV 数字1,数字2[,数字3]...   〈对数字进行÷运算〉
40、STRINGS [目标变量=]AND 数字1,数字2[,数字3]... 〈对数字进行“逻辑与”运算〉
41、STRINGS [目标变量=]OR 数字1,数字2[,数字3]...   〈对数字进行“逻辑或”运算〉
42、STRINGS [目标变量=]NOT 数字1,数字2[,数字3]... 〈对数字进行“逻辑取反”运算〉
43、STRINGS [目标变量=]MEMTOTAL                    〈返回系统总共的常规内存大小〉
44、STRINGS [目标变量=]MEMFREE                     〈返回系统空闲的常规内存大小〉
45、STRINGS [目标变量=]XMSTOTAL                     〈返回系统总共的扩展内存大小〉
46、STRINGS [目标变量=]XMSFREE                      〈返回系统空闲的扩民内存大小〉
47、STRINGS [目标变量=]XMSVER             〈返回当前扩展内存使用的驱动程序的版本号〉
48、STRINGS [目标变量=]EMSTOTAL         〈返回系统总共的扩充内存大小〉
49、STRINGS [目标变量=]EMSFREE           〈返回系统空闲的扩充内存大小〉
50、STRINGS [目标变量=]EMSVER             〈返回当前扩充内存使用的驱动程序的版本号〉
51、STRINGS [目标变量=]STRINGSVER       〈返回STRINGS的版本号〉
作者: darkpiggy     时间: 2005-3-3 00:00
谢谢回复!
可是在strings.com的函数里,没有获取当前路径的啊,这个如何处理呢?

作者: DOSforever     时间: 2005-3-3 00:00
如果你用 4DOS / 4NT 的话那一切都太简单了

PUSHD [PATH]

…………

PUSHD [PATH]

……

POPD

…………

POPD

PUSHD 为将当前路径压栈,其中[PATH]为可选项,如果写明具体了 PATH,则将当前路径压栈后转到新的路径下。比如你当前工作目录为 C:\MSDOS,执行 PUSHD E:\PCTOOLS ,则你立刻就处于 E:\PCTOOLS 目录下了,然后你可以任意的转移路径,不管你转了多少次,只要来一句 POPD 就立刻回到你上一次压栈的目录下了。 PUSHD 和 POPD 可以嵌套,但你要注意它们的工作方式是以栈为结构的,如果多次压栈当弹出的时候要注意顺序。如果你只做一次路径切换,且不在同一个盘,那也不必这么“劳师动众”。比如你当前工作目录为 C:\MSDOS ,以后你不管转到哪一个盘的哪一个目录下(C盘的其它路径除外),要回到原来的路径只需 C: 就可以了。跟你说了这么多我忽然发现你要用到这种功能感到非常奇怪,我 BATCH 编到现在几乎自己都从未用过。我不知道你编写什么需要这样使用?

[ Last edited by DOSforever on 2008-2-29 at 01:00 AM ]
作者: chenhui530     时间: 2005-3-3 00:00
楼上应该要对症下药才行难道你要楼主换系统啊对于楼主的问题我等下给出你答案由于现在本人在处理程序一段时间内不能重启机器.我想strings.com应该可以完成你的要求的
作者: DOSforever     时间: 2005-3-3 00:00
你说的一点没错。我的用意就是建议楼主,包括所有使用BATCH的人把都命令解释器统统换成4DOS / 4NT。我相信,没有一个善于编写BATCH的人会不喜欢它,我想你也一定会对它爱不释手。再说只更换个命令解释器怎么能说是换系统呢?如果你不想用,放着就可以了,也不需要去卸载它。这个和你使用第三方工具没什么区别,而且,你每使用它的一个功能,都要到磁盘上去调用它可执行文件一次。尽管现在的机器速度不是以前的所能比的,但我认为还是要有一个优化意识。在这个论坛上,我看到了太多的为BATCH和一些小问题而伤脑筋的帖子,我实在觉得有些事情没有必要绕个大圈子去做,所以,我一直不余遗力地向大家推荐这个好东西。类似这样的话我已经重复过多次了。当然,我建议只是我建议,用不用是别人的事。
作者: darkpiggy     时间: 2005-3-3 00:00
如果DOS里有如bash的shell的话,我睡着了都会笑醒的
作者: darkpiggy     时间: 2005-3-3 00:00
对了,求教dosforever ,4DOS / 4NT是个啥东东,不要鄙视我,我是新手虽然我从96年就开始用电脑了,但是DOS好久没碰了,新东西不太清楚了4DOS / 4NT哪里有下载的,如何使用?给个链接吧,谢谢啊~~~~我是这几天在做一个支持NTFS格式的,可以从NTFS分区挂载ISO的DOS启动盘才对DOS感兴趣的,现在手上项目很紧,我还抽出时间来玩DOS,不容易啊!!!!所以请大家多帮帮我啊~~[em06]
作者: darkpiggy     时间: 2005-3-3 00:00
给大家看一下我的mount.bat文件吧,还有问题需要解决,就是如何判断一个盘符已经被占用?代码里边这一句肯定是错的if exist "%2" goto drvexist,这个如何修改呢?谢谢~~

@echo off
if "%1" == "" goto use
if "%2" == "" goto use
if not exist "%1" goto noexist
if exist "%2" goto drvexist
A:
LH Smartdrv 4088 4088 >NUL
SHSUCDHD /F:%1 >NUL
SHSUCDX /D:SHSU-CDH,%2 >NUL
cls
ECHO,
ECHO 【ISO光盘镜像文件安装向导】
%2
DIR/W
ECHO,
ECHO  ISO光盘镜像文件已经安装...
ECHO,
goto end
:noexist
echo 文件 %1 不存在,请重新指定镜像文件!
goto end
:use
echo 使用方法: mount 映像文件名 驱动器号
goto end
:drvexist
echo 驱动器名称 %2 已经被使用,请重新指定驱动器名称!
goto end
:end
作者: DOSforever     时间: 2005-3-3 00:00
呵呵,你多心了,我怎么会想到鄙视你呢?谁都不可能样样都懂,我也有许多不懂的地方要向别人请教。我们来论坛的目的就是相互请教,相互帮助,共同进步的。我先大概的和你介绍一下:
4DOS / 4NT 是 JP Software 公司出品的命令解释器,也就是 OS Shell 。当然,我认为只是在纯 DOS 下作为 Shell 使用,在 Windows 下应该看作是一个命令行环境。其实它也不是什么新东西,只是你以前没有注意到罢了。我最早接触 4DOS 是在 Norton 8.0 中所带的 NDOS ,实际上就是 Norton 买了 JP Software 的 4DOS 重命名为 NDOS ,这就和 Microsoft 买了 Norton 的 speedisk 叫作 defrag 一样的道理。最初的 4DOS 命令解释器只有 DOS 环境下的 4DOS.COM (尽管是 .COM,实际上是 .EXE 结构的文件,我想大概是为了保持传统才命名为 .COM的吧),后来随着 Windows 的流行, JP Software 又推出了 Windows 环境下的 4DOS —— 叫作 4NT ,不要被它的名字所迷惑,以为只能在 NT 下使用。它又分为 ASCII 版和 Unicode 版,前者是用于 Win 98/98SE/ME 的,后者是用于 Win NT/2000/XP/2003 的。当然 DOS 下的 4DOS 也可以在 Win9X 下使用,在 NT 系列下我没用过,不清楚,估计运行还是可以运行的,只是某些命令不能正常使用。现在 JP Software 已经放弃了 DOS 下 4DOS 的版权,大家可以 FREE 使用了!关于我对 4DOS 家族的其它简单介绍和它的下载地址你可以先看一下这里:

http://www.cn-dos.net/forum/viewthread.php?tid=15111

和这里:

http://www.cn-dos.net/forum/viewthread.php?tid=15214

权威、全面的介绍那当然是它的官方网站了。

接下来我们来讨论一下你的BATCH问题:
你说的“从NTFS分区挂载ISO的DOS启动盘”我从来没用过,不怕各位笑话,我连ISO文件都没用过,根据你提供的原始文件和我的理解来看,你是从A盘执行SHSUCDHD把ISO文件映射为一个光驱,然后再用SHSUCDX把光驱映射为一个逻辑盘符,然后就转到新生成的逻辑盘上,再给大家看看,“瞧,我已经在新逻辑盘上列文件了。”是不是这意思?假如是的话,我还有几点疑问:为什么你非要到A盘上去执行Smartdrv、SHSUCDHD、SHSUCDX?难道这三个文件和ISO文件放到硬盘上就不能执行吗?比如:
c:\windows\command\Smartdrv 32768
c:\windows\command\SHSUCDHD /F:%1 >NUL
c:\windows\command\SHSUCDX /D:SHSU-CDH,%2 >NUL

我想先把我的问题搞清楚才能作下一步讨论。还有, Smartdrv 不需要 LH,只要你有足够的 UMB 它自己就能够 LH,当然你 LH 它也不会报错。在第一次启动 Smartdrv 的时候,如果你不想看到什么信息也不需要用 >NUL 的方法,因为 Smartdrv 在第一次启动的时候,缺省的就是没有任何提示信息,你要它有提示信息还要加 /V 参数。如果你的内存足够大比如有64M以上的话,不妨把 Smartdrv 的缓存区域开得大一点,反正不用也是浪费。



修正链接

[ Last edited by DOSforever on 2008-6-4 at 03:49 AM ]
作者: chenhui530     时间: 2005-3-4 00:00
真晕啊又没发出去气死我了最近论坛究竟是怎么了啊?
作者: chenhui530     时间: 2005-3-4 00:00
楼住看来还没找到答案我看我还是给你答案.strings a=filedrive pp.bat
strings b=filedir pp.bat
::strings x=filename pp.bat 如果你需要知道原文件的完整路径这个必须你只需要去掉前面的"::"
::strings c=fileext pp.bat 如果你需要知道原文件的完整路径这个必须你只需要去掉前面的"::"
set ypath=%a%%b%
::set d=%a%%b%\%x%.%c% 这是完整的路径
::你切换盘符后运行的代码
...
::你需要返回源路径的代码
%a%
cd\
cd %ypath%

作者: bush     时间: 2005-3-4 00:00
string这个东西好!
作者: willsort     时间: 2005-3-4 00:00
Re All:

    关于工具的选择大家讨论了这么多,其实这不过是个人习惯和使用场合的不同而造成的分歧,我个人编写批处理便很少使用第三方工具,原因无它,主要是因为“将看似不可能的事情变为可能”可以产生一种无与伦比的快乐。下面给出一个不依赖环境的批处理示例吧,在WinXP/DOS7测试通过。
@echo off
echo Current path is:
cd
pause
echo exit | %comspec% /k prompt $N:$_cd $P$_ | find "exit" /v > %temp%.\~retpath.bat
c:
cd\windows
echo Current path is:
cd
pause
for %%c in (call del) do %%c %temp%.\~retpath.bat
echo Current path is:
cd
[ Last edited by willsort on 2005-10-30 at 13:55 ]
作者: DOSforever     时间: 2005-3-7 00:00
呵呵,“笑天”厉害,能够在有限的条件下实现相同的功能堪称高手。不愧于Batchinger的称号。本人受益非浅!但我的一个思想就是在编写BATCH的时候尽可能少使用外部命令和少涉及到磁盘I/O操作。当然现在的机器速度完全可以忽略这个因素,但我仍然保持这一习惯。至于你所说的“少使用第三方工具”。我的看法是其实这个“第三方”只是对厂商而言是个很清晰的概念,对于我们用户来说这个界限是很模糊的。对我们来说,只要东西好使,是无所谓什么第三方不第三方的。比如原来MS-DOS中是没有反病毒、磁盘整理和全屏界面备份这些工具的,microsoft无非是把CPAV拿进来变成MSAV和VSAFE,把SPEEDISK拿进来变成DEFRAG,把NORTON BACKUP拿进来变成MSBACKUP。难道microsoft在把这些包含进它的DOS之前我们就不能用这些“第三方”工具了吗?虽说你只使用了DOS自带的工具,但毕竟“绕了个大圈子”。瞧,如果使用4DOS的话多简洁,两句话就解决问题了,而且全部都是在内存中操作。在少化力气取得同样的效果,而且更省资源的情况下有什么不好呢?我相信,对于你来说使用4DOS一定会更加得心应手,如果你能用它来BATCHING的话可以说是“宝剑配英雄”!另外,我对你在%temp%后面加一个“ . ”感到不解,如此一来岂不成了语法错误?
作者: willsort     时间: 2005-3-18 00:00
Re dosforever:

      因为个人原因没有及时回复兄的发帖,深感抱歉!兄以上的发言,我无不赞同,其实你我所言也并无相悖之处。只是前次回复并没有在工具使用上发表过多意见,但见兄等如此热诚,遂忙里偷闲,借机补述几句,以作深入探讨:

      第一,“第三方”确实只是一个概念,一个由“第一方”软件生产者创造并维护的概念,对于作为“第二方”的使用者——我们来说,通常情况下它是个无关紧要的概念。但在某些特殊情况下,这个概念就可转化为实质上的影响力。比如,微软创造了MSDOS ,并成为了这个系统的毫无疑义的“第一方”,而西门铁克、JPSoftware之类则有意无意半推半就地成为了这个系统的“第三方”,而“第二方”的我们往往可以随时放弃任何“第三方”,因为我们常常可以找到更好的替代品,但对“第一方”我们已经产生了一种无可争议的依赖,因为我们很难找到同样的代替品。

      第二,任何人都可以使用任何第三方的产品,但前提是他能得到这个产品。兄默认4DOS是任何DOS 迷都可以轻松得到的宝物,所以才不遗余力地推广它。但是目前看来,它的获取途径与我们所经常使用的软件产品(比如DOS 和Windows )相比而言,还是要狭窄得多,有相当多的DOS 使用者无法接触网络甚至D 版光盘(也许你感到不可思议,因为我曾经学习过4DOS,但是只是在书与本中,因为当时我无法得到这个软件,所以最后我放弃了继续深入),对于他们而言,使用第一方产品来完成自己的需求有着相当必要性和必然性;另外,在诸如启动盘、无盘站等上机环境中,第一方产品有时是无可奈何的必然选择。

      第三,在批处理中使用外部命令以至第三方工具都是完全可以的,但是同时你需要保证它在可能运行的任何环境中都能得到足够的支持,为了满足这种支持,一者是将所有的支持程序同你的批处理同时打包在一起进行发布,二者可以将外部程序以类似 MIME 的方式编码入批处理程序内部,但是这些方法都会造成程序体积过大,丧失了批处理程序的优越性。所以,我们只能限制批处理程序的运行环境,但有时这种限制是致命的。

      第四,减少IO确有其必要性,但如果无法避免而不会明显影响程序运行时,适当使用也可以收到化腐朽为神奇的效果。我现在所编写的批处理程序几乎已经无法避免地要使用到它,它已经成为了我的批处理编程语法中异常重要的一部分。

      第五,%temp%.\的用法并不属于一种语法错误,而是一种语法技巧。他是为了兼容对带斜线路径(比如C:\)和不带斜线路径(比如C:\temp)的引用。如果%temp%为类似于C:\的根路径时,则%temp%.\filename.ext 为C:\.\filename.ext ,因为根路径下的当前路径仍然是根路径,所以不会影响文件的引用,但却防止了双“\”的路径语法错误;而如果%temp%为类似C:\temp 的目录路径时,则%temp%.\filename.ext则变成了C:\temp.\filename.ext ,因为Temp. (无扩展名的目录名)仍然是temp,所以文件引用依然有效,也防止了不带“\”的路径语法错误。

      最后,以兄的签名作结,表达我们共同的祝愿!

      ——“DOS倒下了,但永远不死”

[此贴子已经被作者于2005-3-18 19:09:32编辑过]



[ Last edited by willsort on 2005-10-30 at 13:58 ]
作者: chinaren12     时间: 2005-3-18 00:00
不错,长知识呀,批处理我是菜鸟呀,要好好学习呀
作者: shijianxin     时间: 2005-8-8 02:45
高手啊!佩服之至!
作者: javenhmh     时间: 2007-5-4 13:48
厉害,佩服至极,是我学习的榜样。
作者: yeke     时间: 2007-5-4 20:50
我来学习学习
作者: chishingchan     时间: 2009-11-5 22:02
可惜可惜,没有关于硬盘容量的检测及数字大小的对比功能!