联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
[此贴子已经被作者于2004-5-30 下午 01:16:51编辑过]
[此贴子已经被作者于2004-5-30 下午 03:51:57编辑过]
[此贴子已经被作者于2004-5-30 下午 07:38:26编辑过]
[此贴子已经被作者于2004-5-30 下午 09:02:18编辑过]
原程序中存在一个认识上的误区,那就是for循环中的变量只在循环语句中有效,在 循环语句之外是无法识别循环变量%%i的,此点与高级语言的局部变量类似。 了解问题的原因就可以想出简单的办法了,下面提供两种办法仅供参考: 1,利用环境变量保存循环变量。环境变量全局有效,而且存取简单,所以是一个非常 理想的保存临时数据或信息的方法。需要注意的是,此方法会始终搜索所有给出的逻辑盘,假 如d和f盘都符合条件,程序将取后者;如果想取前者,把循环集中的盘符列表逆序书写即可 。 @echo off set drive= for %%i in (c d e f g h i j ) do if exist %%i:\SYS.gho set drive=%%i if [%drive%]==[] goto err :label label %drive%:SYSTEM md %dirve%:\boot copy aa.txt %drive%:\boot set drive= goto exit :err echo nofile :exit 2,利用命令行参数传递循环变量。命令行参数也是常用的变量类型之一,它可以方便 的向程序传递各种信息。此方法与1不同的是,它一旦匹配逻辑盘就立即跳出循环,所以它会 仅取第一个匹配的逻辑盘。如果想处理所有匹配的逻辑盘,可以将for语句中的%0 %%i 改为 call %0 %%i @echo off for %%i in (c d e f g h i j ) do if [%1]==[%%i] goto label for %%i in (c d e f g h i j ) do if exist %%i:\SYS.gho %0 %%i goto err :label label %1:SYSTEM md %1:\boot copy aa.txt %1:\boot goto exit :err echo nofile :exit 另外,以上所有的if exist %%i:\SYS.gho 都存在一个潜在的问题:如果 %%i 为光驱的 盘符,且此光驱中无盘的话,会出现读盘错误,影响程序的正常执行。这是一个比较复杂的问 题,也有多种解决办法,建议参考"中国DOS联盟论坛\解答室"中相关的帖子。