我不知道你程序内部干了什么,就给你解释一下原理吧。
假设你的程序所在目录为D:\1,11.bat和111.TXT都在这个目录中。在DOS中,你现在C:\,那么执行指令D:后,一般会转到D:\(当DOS启动后没有对D:进行过操作时是这样)。这个时候,再执行CD 1,就会转入D:\1目录,注意,CD 1在目录名前没有加绝对路径,表示从当前目录开始向下进入。好了,现在当前目录是D:\1,然后,你做了其他的事,比如执行C:转到C盘——现在问题出现了,你再执行前面那个批处理,则D:这句转到D:\1上,因此你之前的操作已把D:盘的当前盘设置到D:\1这个目录上,不再是原始的D:\,这时接着执行CD 1,就要从这个目录往下找D:\1\1这个目录,看到错误了没有?
在DOS和Windows系统中,凡是没有指定绝对路径的,都从当前目录开始作相对路径,关键是当前目录是哪里!
因此,你那个批处理安全的写法应是如下:
@echo off
cls
D:
cd \1
11.bat D:\1\111.txt
pause
描红的行解释如上,是确保每次执行本批处理指令时都进入D:\1目录而不是D:当前目录的下层1目录,而不管D:的当前目录是在哪里。
对指令D:\1\11.bat D:\1\111.txt,是不管当前位于哪一个目录及任何磁盘,均执行绝对路径的批处理,但在执行11.bat的内部指令时,会出现当前目录引起的问题——假设在这个批处理中又有类似cd 1这样指令。
所以,问题的根源其实是:你反复执行了那个没有反斜线的cd 1指令。