无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5433|回复: 8
打印 上一主题 下一主题

DOS当前路径以及程序运行过程中生成的文件存放路径等相关问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-6-8 09:44:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
环境: MS DOS 7。1

讨论: DOS的当前路径以及程序生成的文件存放路径相关问题。

这几天自己在写DOS下的批处理,遇到一个问题,就是关于程序运行过程中产生的文件,比如错误日志等存放的问题。
另一个问题就是使用CALL 调用程序的时候,写上全路径跟不写路径只有程序名,运行时哪一个速度更快一些。


对于第一个问题,其实DOS的当前路径很容量理解,查看当前路径,可以使用CD命令或者用DIR来查看当前所处的工作路径。

这儿有一点注意,就是在调用程序的时候,不论程序所在的位置,程序运行时产生的文件一般都会存放到当前路径,而不是程序所在路径,除非程序产生的文件由程序内部固定输出到某一位置。

举个例子来说: 当前在C盘根目录: C:\ ,然后C盘下有一个A文件夹,其中有一个X。BAT文件,当在C:\下运行 c:\a\x.bat 的时候,X。BAT文件的输出会放到C:\下面,而不是c:\a下面,除非使用CD C:\A ; X。BAT这样的方法来运行,X。BAT的输出才会放到A文件夹下,同样如果当前在C:\b文件夹,使用C:\A\X.BAT,X。BAT的输出会放到C:\B下面。  所以,在编写批处理的时候,在判断文件输出的时候,一定要注意,要么就直接指定输出到绝对路径,要么就不要写路径,都使用当前路径。


另一个问题就是程序运行速度。看具体例子:

使用PATH C:\;C:\A 指定了程序路径,X.BAT 位于 c:\a 下,使用 c:\a\x.bat 来运行X。BAT跟直接 x.bat来运行X。BAT文件,哪一种方法更快呢??? 两者差不多,还是完全一样???  我个人的看法是,可能感觉不出有什么区别,但如果是在读写速度很慢的设备上运行时,应该全路径更快一些。

[ 本帖最后由 sgw888 于 2009-6-8 10:51 编辑 ]
2#
发表于 2009-6-8 11:36:34 | 只看该作者
第一个问题涉及到可执行文件编码中默认的定义,是定义在执行目录又或定义在DOS所定义的变量临时目录等等,解决方案有很多种,如:你上面提到的转换执行目录、修改程序内码、定义DOS环境等等。。。
第二个问题肯定的说是完全路径快,特别是当DOS的PATH多且程序不在当前目录下时。。。
回复

使用道具 举报

3#
发表于 2009-6-8 14:00:37 | 只看该作者
理论山当然是完全路径快,省去了查找的过程,不过实际上,大部分情况下,闪电侠都未必能感觉到差别啊

第一个问题,应该大部分人都没有疑问的吧,指定调用别的路径下的文件,本来就没有改变当前目录属性,所以理所当然的除非那个文件指定了输出目录,要不就还是原来的路径
回复

使用道具 举报

4#
发表于 2009-6-8 15:46:15 | 只看该作者
搬凳子学习,欢迎继续。
回复

使用道具 举报

5#
 楼主| 发表于 2009-6-8 21:05:08 | 只看该作者
原帖由 NicTense 于 2009-6-8 14:00 发表
理论山当然是完全路径快,省去了查找的过程,不过实际上,大部分情况下,闪电侠都未必能感觉到差别啊

第一个问题,应该大部分人都没有疑问的吧,指定调用别的路径下的文件,本来就没有改变当前目录属性,所以 ...

呵呵,应该是大部分人都没有疑问的,可是有时候也会犯糊涂的。特别是调用很多子程序,然后在多个程序之间相互转换,引用多个路径,然后再判断生成文件的时候就迷糊了。
回复

使用道具 举报

6#
 楼主| 发表于 2009-6-8 21:36:10 | 只看该作者
面对不同的情况,就需要做不同的处理,办法就可以变通。
对于第一个问题,如果是需要批处理运行过程中去判断有没有生成相应的文件,那么路径的写法就很重要,文件的输出究竟是存放于程序所在目录还是DOS的当前路径一定要搞清楚,否则判断就会出错,再有一个就是尽量避免在多个目录之间切换,当然,如果输出文件全部采用指定的绝对路径的话,就无所谓了,但有时候是不能指定的。另外一种情况就是,为了能使编写的程序具有通用性,也可以说是可移值性,可重复利用性,那么我个人认为应尽量避免使用绝对路径而是使用当前路径,不过,这样以来,在调用程序的时候,也需要注意

举个具体的例子来说,比如GHOST调用,如果操作没有成功完成,中间出错的话,GHOST会生成相应的错误报告,如果判断有错误报告生成,就可以确定当前调用没有成功结束,刚开始的时候,我以为GHOST的错误报告存放于它所在的目录,可是后来我才绕过弯来,错误报告存放于DOS的当前路径而不是GHOST的所在目录,这样,就需要特别注意程序运行时所处的当前路径,因为如果判断路径错误的话,就没有任何意义了,我自己的做法是不改变当前路径,当前路径保持总是C:\,然后采用 全路径调用GHOST,或者是用PATH指定可执行路径,让DOS自己寻找GHOST并运行。有些子程序是可以重复使用的,比如一个可以读取当前日期并写到一个文件的程序,如果使用绝对路径的话,好处当然是有,可是坏处也是很明显的,就是如果在别的场合使用的话,有可能就必须得重新修改,所以说如果你编写的批处理想在别的地方可以直接调用的话,就不要用绝对路径,而是改由其它“调用它的程序”来完成相应的处理工作。




第二个问题的想法:  

大家都肯定全路径的写法会提高速度。但是事情总是两方面的,如果是在可执行文件少,并且PATH指定的可执行路径少,而且编写的批处理当中有大量的程序调用的话,我个人觉得还是不要用全路径,全路径写起来麻烦,而且也会增加批处理的长度。 但如果可执行文件多,PATH指定的路径又很多的时候,建议使用全路径来直接调用程序,这儿也有一个当前路径的问题,对于当前路径下的程序,不需要使用全路径调用,因为DOS会首先寻找当前路径下的可执行程序。
回复

使用道具 举报

7#
发表于 2009-6-9 11:55:11 | 只看该作者
要确定CMD所在的目录一定要展开%0

网上很多讨论只是提到环境变量中的当前目录%cd%,极少用到%0,%0是老毛桃修改本人的PE中使用的,是本人建议他使用%0而不要使用%cd%。
回复

使用道具 举报

8#
发表于 2009-6-9 12:06:36 | 只看该作者
原帖由 lxl1638 于 2009-6-9 11:55 发表
要确定CMD所在的目录一定要展开%0

网上很多讨论只是提到环境变量中的当前目录%cd%,极少用到%0,%0是老毛桃修改本人的PE中使用的,是本人建议他使用%0而不要使用%cd%。


这里讨论的是dos,而不是cmd,呵呵。
回复

使用道具 举报

9#
发表于 2009-8-27 17:42:21 | 只看该作者
错误报告存放于DOS的当前路径而不是GHOST的所在目录.........
-----------------------------
ghost 生成的镜像也是默认放到DOS的当前路径的话,那就可以省去写磁盘、分区号了。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-16 07:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表