中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-23 12:23
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,273 会员排行
DOS批处理 & 脚本技术(批处理室) » 一个简单批处理的难题
可打印版本  1,994 / 8
第1楼 walu 发表于 2004-05-30 00:00
高级用户 发帖 201 积分 916
一个简单批处理的难题
一个简单批处理的难题

@ECHO OFF
for %%i in (c d e f g h i j ) do if exist %%i:\SYS.gho GOTO label
goto err

:label
label %%i:SYSTEM
md %%i:\boot
copy aa.txt %%i:\boot
goto exit

:err
echo nofile

:exit


批处理的意思是:如果C分区存在SYS.GHO文件,就跳转到:label执行相应命令,不再继续查找其它分区,如此类推。。。。。。
但按上面的编写执行出错。不少网友给了不同的解决方案,但都没有正确的。
请willsort等高手出手!


第2楼 haonanren 发表于 2004-05-30 00:00
初级用户 发帖 14 积分 162
好像没有什么问题.
第3楼 haonanren 发表于 2004-05-30 00:00
初级用户 发帖 14 积分 162
运行正确
第4楼 Tamm 发表于 2004-05-30 00:00
中级用户 发帖 64 积分 397
你的批处理出错可能是因为: %%i 离开 FOR 语句以后将失效

你可尝试这样看行不行:(未经测试,我只是提供一个思路)

@ECHO OFF
SET SYS=
for %%i in (c d e f g h i j ) do if exist %%i:\SYS.gho SET SYS=%%i
if %SYS%*==* goto err
GOTO :label


:label
label %SYS%: SYSTEM
md %SYS%:\boot
copy aa.txt %SYS%:\boot
goto exit

:err
echo nofile

:exit





第5楼 zhri 发表于 2004-05-30 00:00
高级用户 发帖 153 积分 665
if exist c:\SYS.GHO

。。。。。。
第6楼 quya 发表于 2004-05-30 00:00
高级用户 发帖 172 积分 558 来自 江苏
改成下面的就可以了,程序主要错在%%i 变量不能传递到 :label子程序中,所以要用一个全局环境变量%mydrive%来过渡一下。

@ECHO OFF
for %%i in (c d e f g h i j ) do if exist %%i:\SYS.gho set mydrive=%%i
if not defined mydrive (goto err) else (goto label)

:label
label %mydrive%:SYSTEM
md %mydrive%:\boot
copy aa.txt %mydrive%:\boot
goto exit

:err
echo nofile

:exit




第7楼 walu 发表于 2004-05-30 00:00
高级用户 发帖 201 积分 916
谢谢quya兄!
在WIN 98下运行如果只有C、D分区的情况下,显示“NOT READ READING DRIVE E”。
在WIN XP是有效,但如果后面的分区有BOOT。INI文件的话,即使C分区有BOOT。INI文件,它也检测到后面的分区,而不是检测到C分区有就结束。
真希望哪位兄弟能解决这个久未解决的问题,即既能在WIN XP下运行也能在WIN 98下运行。


第8楼 Tamm 发表于 2004-05-30 00:00
中级用户 发帖 64 积分 397
再推荐一个复杂但易于操作和理解的办法:

========================
主批处理中:
========================
@ECHO OFF
CALL TestDrv.bat C D E F G H I J K L M N O P Q R S T U V W X Y Z
IF %SysDrv%*==* GOTO err
GOTO label

:label
label %SysDrv%: SYSTEM
md %SysDrv%:\boot
copy aa.txt %SysDrv%:\boot
goto exit

:err
echo nofile

:exit
===========================
子批处理 TestDrv.bat 内容如下:
===========================
@ECHO OFF
SET SysDrv=
:LOOP
DReady %1
IF NOT ERRORLEVEL 1 IF EXIST %1:\BOOT.INI GOTO FOUND
SHIFT
IF %1*==* GOTO END
GOTO LOOP

:FOUND
SET SysDrv=%1
:END
========================
在子批处理中使用了一个 DReady.com 是 Horst's Batch Tools 中的一个小工具。用于测试驱动器状况,返回 ERRORLEVEL 表示驱动器是否准备好。
第9楼 willsort 发表于 2004-06-02 00:00
元老会员 发帖 1,512 积分 4,432
Re All:

  walu兄对此系列问题的执著很令我钦佩。现将我在Email中所做的回复转贴于此,权作补遗。因为回复之前并未见到此帖,难免与各位方家观点有所重复,尚请无怪!


  原程序中存在一个认识上的误区,那就是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 == 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 == 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联盟论坛\解答室"中相关的帖子。


[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023