Board logo

标题: 请教 高手 一个变量的问题. [打印本页]

作者: 哑巴     时间: 2004-3-18 00:00    标题: 请教 高手 一个变量的问题.

我做了一张盘,用dos8系统
A:\ 的目录

2000-06-08  17:00           118,272 IO.SYS
2004-03-18  21:46               206 AUTOEXEC.BAT
2004-03-18  21:15               116 CONFIG.SYS
2004-03-17  22:54               134 nopri.bat
2004-03-18  22:10             2,111 FIXGHO.BAT
1999-10-10  08:01            45,379 SMARTDRV.EXE
2000-06-08  17:00            25,473 MSCDEX.EXE
1997-11-16  10:01           239,333 TW.EXE
2003-04-08  18:34             3,188 FINDCD.EXE
2004-03-17  22:51               125 nocd.bat
2004-03-18  00:37             1,396 FIXPIO.BAT
2002-12-12  18:27             8,666 WBAT.COM
2000-06-08  17:00            64,425 FLASHPT.SYS
2000-06-08  17:00            53,767 EXTRACT.EXE
2000-06-08  17:00            66,300 FDISK.EXE
2000-06-08  17:00            93,442 COMMAND.COM
2000-06-08  17:00            33,191 HIMEM.SYS
2000-06-08  17:00            41,302 OAKCDROM.SYS
2000-06-08  17:00            15,252 ATTRIB.EXE
2000-10-04  18:22                 9 MSDOS.SYS
1998-06-19  20:01             6,855 FINDRAMD.EXE
=======config.sys=======
device=oakcdrom.sys /D:mscd001
device=flashpt.sys
files=40
buffers=10
dos=high,umb
stacks=9,256
lastdrive=z
=======autoexec.bat=====
@ECHO OFF
path=a:\;c:\windows;c:\windows\command
SET DIRCMD=/O:N
MSCDEX.EXE /D:mscd001
IF ERRORLEVEL 1 nocd
findcd >nul
IF "%CDROM%"=="C:" NOPRI
set path=%path%;%CDROM%\
smartdrv 2048 1024
fixgho
=======fixpio.bat========
@ECHO OFF
SET PIO=
IF "%CDROM%"=="E:" SET PIO=d:
IF "%CDROM%"=="F:" SET PIO=d:,e:
IF "%CDROM%"=="G:" SET PIO=d:,e:,f:
IF "%CDROM%"=="H:" SET PIO=d:,e:,f:,g:
IF "%CDROM%"=="I:" SET PIO=d:,e:,f:,g:,h:
IF "%CDROM%"=="J:" SET PIO=d:,e:,f:,g:,h:,i:
IF "%CDROM%"=="K:" SET PIO=d:,e:,f:,g:,h:,i:,j:
IF "%CDROM%"=="L:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:
IF "%CDROM%"=="M:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:
IF "%CDROM%"=="N:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:
IF "%CDROM%"=="O:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:
IF "%CDROM%"=="P:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:
IF "%CDROM%"=="Q:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:
IF "%CDROM%"=="R:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:
IF "%CDROM%"=="S:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:
IF "%CDROM%"=="T:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:,s:
IF "%CDROM%"=="U:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:,s:,t:
IF "%CDROM%"=="V:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:,s:,t:,u:
IF "%CDROM%"=="W:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:,s:,t:,u:,v:
IF "%CDROM%"=="X:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:,s:,t:,u:,v:,w:
IF "%CDROM%"=="Y:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:,s:,t:,u:,v:,w:,x:
IF "%CDROM%"=="Z:" SET PIO=d:,e:,f:,g:,h:,i:,j:,k:,l:,m:,n:,o:,p:,q:,r:,s:,t:,u:,v:,w:,x:,y:
======nopio=======
@tw /np
@cls
@echo.
@echo.
@echo 错误:找不到可用的硬盘分区。
@echo 请按 连接上硬盘和分区后再用本光盘。
@echo.
@pause
@TW /Q
=====fixgho.bat=========
set wgho=
:fixgho
call fixpio
for %%i in (%PIO%) do if exist %%i%\ghost\system.gho set gho=%%i%
rem  在这里为什么我无法设置gho的值?
if "%gho%"#==# goto nogho
tw /np >nul
cls
goto res
:nogho
WBAT BOX "在您的电脑中找不到系统镜像文件,无法还原系统,是否要自动备份系统?",是,否 #1,32
IF ERRORLEVEL 100 GOTO end
IF ERRORLEVEL 2 goto end
IF ERRORLEVEL 1 goto write
goto end
:res
WBAT BOX "在 %gho% 盘找到一个镜像文件,请选择操作",系统还原,删除还原文件 #1,64
IF ERRORLEVEL 100 GOTO end
IF ERRORLEVEL 2 GOTO delgho
IF ERRORLEVEL 1 GOTO ress
goto end
:del gho
attrib -s -h -r %gho%\ghost\system.gho
del %gho%\ghost\system.gho
tw /q
fixgho
:ress
echo.
echo.
echo            警告:C: 盘上的数据将被完全
echo            删除并还原到上次备份的状态
echo            请确定您已经备份了 C: 盘上
echo            的重要数据才进行此操作
echo            确定还原请按任意键
echo            按 Ctrl+C 键取消此操作
echo.
echo.
pause >nul
echo %CDROM%:\GHOST\ghost -clone,mode=pload,src=%gho%\ghost\system.gho:1,dst=1:1 -sure -rb
goto end
:write
if "%CDROM%"=="D:" GOTO nodr
WBAT BOX "请选择要保存 C 盘系统镜像的盘符",%PIO%,取消 #1,64
IF ERRORLEVEL 100 GOTO end
IF ERRORLEVEL 23 set wgho=Y:
IF ERRORLEVEL 22 set wgho=X:
IF ERRORLEVEL 21 set wgho=W:
IF ERRORLEVEL 20 set wgho=V:
IF ERRORLEVEL 19 set wgho=U:
IF ERRORLEVEL 18 set wgho=T:
IF ERRORLEVEL 17 set wgho=S:
IF ERRORLEVEL 16 set wgho=R:
IF ERRORLEVEL 15 set wgho=Q:
IF ERRORLEVEL 14 set wgho=P:
IF ERRORLEVEL 13 set wgho=O:
IF ERRORLEVEL 12 set wgho=N:
IF ERRORLEVEL 10 set wgho=M:
IF ERRORLEVEL 9 set wgho=L:
IF ERRORLEVEL 8 set wgho=K:
IF ERRORLEVEL 7 set wgho=J:
IF ERRORLEVEL 6 set wgho=I:
IF ERRORLEVEL 5 set wgho=H:
IF ERRORLEVEL 4 set wgho=G:
IF ERRORLEVEL 3 set wgho=F:
IF ERRORLEVEL 2 set wgho=E:
IF ERRORLEVEL 1 set wgho=D:
if exist %wgho%\ghost\nul md %wgho%\ghost
echo.
echo 这是备份
echo %CDROM%\GHOST\ghost -clone,mode=pdump,src=1:1,dst=%wgho%\ghost\system.gho -sure -rb
goto end
:nodr
cls
echo.
echo.
echo      你的电脑只有一个DOS分区,无法备份系统!
echo.
echo.
pause
goto end
:end
tw /q >nul
@echo on
=====================

问题是上面的红字,请高手帮忙!!!









[em24][em06][em24]

[此贴子已经被作者于2004-4-12 9:27:39编辑过]



作者: aria     时间: 2004-3-19 00:00
呵呵,建议你把OAKCDROM.SYS换成VIDE-CDD.SYS
使用FLASHPT.SYS,难道你想支持特殊光驱吗?

另外,这篇帖子不应该发到这里

[此贴子已经被作者于2004-3-19 14:37:26编辑过]



作者: 哑巴     时间: 2004-3-19 00:00
多谢aria赐教,
我是问盘中的fixgho.bat中为什么我无法设置gho变量的值?
回显是
if exist %PIO% <-这个PIO值是正确的。
请各位大侠帮我。
作者: 哑巴     时间: 2004-3-25 00:00
请高手看看!!!!
作者: Climbing     时间: 2004-3-26 00:00
你的批处理中的for循环变量使用方式有问题。我感觉应该写成这样:

for %%i in (%PIO%) do if exist %%i\ghost\system.gho set gho=%%i
rem  在这里为什么我无法设置gho的值?
if "%gho%"=="" goto nogho



作者: 哑巴     时间: 2004-3-30 00:00
把for %%i in (%PIO%) do if exist %%i%\ghost\system.gho set gho=%%i%
写成for %%i in (%PIO%) do if exist %%i\ghost\system.gho set gho=%%i
可Dos会提示语法错误。
作者: Climbing     时间: 2004-3-31 00:00
是不是你的DOS 8有问题,这是我在Win2003的DOS窗口单步执行的命令结果:
D:\>set PIO=c:,d:,e:,f:

D:\>for %i in (%PIO%) do if exist %i\ghost\system.gho set gho=%i

D:\>if exist c:\ghost\system.gho set gho=c:

D:\>if exist d:\ghost\system.gho set gho=d:

D:\>if exist e:\ghost\system.gho set gho=e:

D:\>if exist f:\ghost\system.gho set gho=f:

从结果看,没有什么问题呀
作者: 哑巴     时间: 2004-4-11 00:00
2003和XP好象是可以,但换成DOS8.0和DOS7.1都无法传递%PIO%的值。
这是为何???????

作者: willsort     时间: 2004-4-13 00:00
Re 哑巴:

    如果想在DOS7/8版本下运行正常,请将%PIO%值中的盘符分隔符改为分号,也可以是等号或者空格,但不能是逗号,否则for命令无法分离出单独的驱动器盘符。
作者: 哑巴     时间: 2004-4-13 00:00
willsort  是个好同志,我为什么没有注意到这点!
98启动盘的%LglDrv%就是个好例子,
我记得DOS622好象只能用逗号,太久没用给忘了。
作者: willsort     时间: 2004-4-14 00:00
Re 哑巴:

    在DOS的一系列版本中,除了NT平台下的虚拟DOS控制台之外,其他所有的版本,都支持三种命令参数分隔符,那就是分号、等号和空格。

    命令行中较常使用的是空格,FOR语句中的循环集中较常使用的是分号,而在内部命令PATH中较常使用的是等号。除了极个别的场合之外,基本上所有的内部命令都兼容三种参数分隔符,也就是说,在内部命令的使用中,可以用空格的地方,也可以使用等号和分号,效果是等同的。

    其中的原因是,作为内部命令的统一管理者command.com处理参数分隔的情况时,为了简单的支持各种场合的使用,而将他们一律作成通用分隔符处理。当然,在外部命令中,使用了自身的参数分隔识别机制,因而没有空格以外多余的分隔符;而在某些内部命令(如set)中,对等号和分号可能有特殊的解释,属于特殊例外。


[此贴子已经被作者于2004-4-20 11:24:39编辑过]



作者: 哑巴     时间: 2004-4-19 00:00
这个好理解,谢了,我目前还有一点小问题没有搞定。