中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-01 12:43
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请问在这个批处理中为何%WHAT%的值无法正确传给其他变量? 查看 1,701 回复 10
楼 主 请问在这个批处理中为何%WHAT%的值无法正确传给其他变量? 发表于 2005-10-29 20:50 ·  中国 河北 沧州 联通
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
23年会员
UID 517
性别 男
状态 离线
最近我写了一个批处理程序,但是每执行到这一段就不对了:


*******************************
echo 你要恢复系统到哪一个分区(请输入分区号或盘符)?(123456789或DEFGHIJKL):
set WHAT=
what s
for %%a in (D E F G H I J K L) do IF == goto _copy
for %%b in (1 2 3 4 5 6 7 8 9) do IF == set HDRV=1:%%b
ghost -clone,mode=pload,src=%CDROM%\sysbak.GHO:1,dst=%HDRV% -sure -rb
goto to_BOOT

:_copy
for %%c in (C D E F G H I J K L) do IF == set HDRV=%WHAT%
sys %HDRV%:
copy /y a:\gho\*.*\ %HDRV%

************************************

后来才发现变量%HDRV%中的值不对,是空的。好象是这两句有错:

for %%a in (D E F G H I J K L) do IF == goto _copy
for %%b in (1 2 3 4 5 6 7 8 9) do IF == set HDRV=1:%%b

请兄弟们帮我看看到底错在那里?为什么?


—————————————— Edited by willsort ——————————————
原标题:请兄弟们帮我看看到这个批处理底是那里不对.
为了方便用户的浏览和版主的管理,请在帖子的标题中简要叙述其内容或意图
修改标题可点击帖子下方的"编辑"按钮,在编辑页面中修改标题后确认即可
若三日后仍未进行修改,将由版主进行修改,同时将扣除此帖作者的4点积分
—————————————— Edited by willsort ——————————————


[ Last edited by sglxy on 2005-11-1 at 23:51 ]
2 发表于 2005-10-29 22:44 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
23年会员
UID 517
性别 男
状态 离线
各位版主,有在线的吗?麻烦你们给看看,先谢谢了。
3 发表于 2005-10-30 19:51 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
23年会员
UID 517
性别 男
状态 离线
可惜,高手们都不在!
4 发表于 2005-10-30 23:06 ·  中国 广东 广州 海珠区 电信
金牌会员
★★★★
D◎$ Fαп
积分 4,562
发帖 1,883
注册 2004-01-19 00:00
22年会员
UID 15812
性别 男
来自 广东广州
状态 离线
试试将 [%WHAT%] 改为 [%%WHAT%%]
----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
5 发表于 2005-10-31 12:03 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 2,227
发帖 790
注册 2005-01-27 00:00
21年会员
UID 35703
性别 男
状态 离线
Re sglxy:

你的what的使用方法有问题,不应该用what S,要用what C "提示信息" 字符列表,C命令会自动限制输入字符的范围,因而不用再进行IF测试,修改如下:
*******************************
set WHAT=
what C "你要恢复系统到哪一个分区(请输入分区号或盘符)?(123456789或DEFGHIJKL):" 123456789DEFGHIJKL
for %%a in (D E F G H I J K L) do goto _copy
for %%b in (1 2 3 4 5 6 7 8 9) do set HDRV=%%b
ghost -clone,mode=pload,src=%CDROM%\sysbak.GHO:1,dst=1:%HDRV% -sure -rb
goto to_BOOT

:_copy
for %%c in (C D E F G H I J K L) do set HDRV=%WHAT%
sys %HDRV%:
copy /y a:\gho\*.*\ %HDRV%
*******************************

[ Last edited by 本是 on 2005-10-31 at 12:44 ]
my major is english----my love is dos----my teacher is the buddha----my friends--how about U
6 发表于 2005-10-31 12:56 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
23年会员
UID 517
性别 男
状态 离线
谢谢"本是"兄弟的答复,但是我还有个问题,请看:

for %%a in (D E F G H I J K L) do goto _copy

如果这样改过后的语法是不是有点别扭?
7 发表于 2005-10-31 14:16 ·  中国 山西 太原 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re sglxy & 本是:

sglxy 兄原来的代码会产生问题,应该与 %what% 变量有关,至于 what s 的使用法对错,因为早已不接触这个工具而无法置评;不过我猜测 what s 是接受字符串输入的,因此也应该能实现你的意图才对。

for %%a in (D E F G H I J K L) do IF [%%a]==[%WHAT%] goto _copy 不仅仅“限制输入字符的范围”,同时将对输入的字符进行分选,为字母则 goto _copy ,为数字则 ghost ,因此不应省略其中的 if 片断。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
8 发表于 2005-10-31 16:36 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 2,227
发帖 790
注册 2005-01-27 00:00
21年会员
UID 35703
性别 男
状态 离线
willsort说的“
for %%a in (D E F G H I J K L) do IF == goto _copy 不仅仅“限制输入字符的范围”,同时将对输入的字符进行分选,为字母则 goto _copy ,为数字则 ghost ,因此不应省略其中的 if 片断。”很正确。

what C 命令能对输入的字符进行范围限定,S命令不行。这对本.BAT应该是非常重要的。

此处的问题大概是NT系列操作系统对环境变量的设置规则不同于WIN9X所致!

[ Last edited by 本是 on 2005-10-31 at 16:38 ]
my major is english----my love is dos----my teacher is the buddha----my friends--how about U
9 发表于 2005-10-31 18:27 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
23年会员
UID 517
性别 男
状态 离线
非常感谢两位高手的指点,这个批处理是我制作的隐藏分区自动恢复功能的一段,方法是先:运行gdisk显示分区信息后,然后再手工输入要对哪一个分区进行操作。而what s命令将输入键值用%WHAT%变量传到for %%a in (D E F G H I J K L) do IF == goto _copy中进行判断,如果是其中的一个则说明该分区没有被隐藏(分区隐藏后不会有盘符),我就可以对该分区安装上一些个性化的恢复功能。但是就是这个我自认为万无一失的方法偏偏得不到应有的结果,我现在不明白的是,为何for %%a in (D E F G H I J K L) do IF == goto _copy这一句判断句会不起作用,我认为其语法应该没有错啊。
另外请教一下“ 本是”老兄,在需要限定输入字符范围的情况下“what c”命令该如何书写(语法)?得到的结果是什么样的变量形式,应该如何对该变量进行操作? 请您举个例子,谢谢!

[ Last edited by sglxy on 2005-10-31 at 18:38 ]
10 发表于 2005-11-01 13:37 ·  中国 河北 石家庄 联通
新手上路
积分 3
发帖 2
注册 2005-11-01 11:55
20年会员
UID 44402
状态 离线
个人有个编程习惯,就是在出错语句的前面将它调用的参数一一显示一下,不知道你尝试过没有
11 发表于 2005-11-02 12:55 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re sglxy:

what c 的用法 本是 兄在5楼就已给出了,最后一个参数 123456789DEFGHIJKL 即是限定其输入范围的,what 的其它用法多看其命令行帮助也应不难理解。

for %%a in (D E F G H I J K L) do IF [%%a]==[%WHAT%] goto _copy 是没有什么语法错误,但不保证没有用法错误,如果 %WHAT% 的变量值的前或后含有空格,那么你就永远无法使 if 的判断成立。所以应该根据 Archimonde 的建议,在for语句前加一句 echo what result=[%what%] 查看其输出结果是否正常。如果这个结果正常,那问题可能处在其它语句中。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
论坛跳转: