中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-23 14:46
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,273 会员排行
DOS批处理 & 脚本技术(批处理室) » 请问在这个批处理中为何%WHAT%的值无法正确传给其他变量?
可打印版本  1,823 / 10
第1楼 sglxy 发表于 2005-10-29 20:50
中级用户 发帖 87 积分 397
请问在这个批处理中为何%WHAT%的值无法正确传给其他变量?
最近我写了一个批处理程序,但是每执行到这一段就不对了:


*******************************
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楼 sglxy 发表于 2005-10-29 22:44
中级用户 发帖 87 积分 397
各位版主,有在线的吗?麻烦你们给看看,先谢谢了。
第3楼 sglxy 发表于 2005-10-30 19:51
中级用户 发帖 87 积分 397
可惜,高手们都不在!
第4楼 JonePeng 发表于 2005-10-30 23:06
金牌会员 发帖 1,883 积分 4,562 来自 广东广州
试试将 [%WHAT%] 改为 [%%WHAT%%]
第5楼 本是 发表于 2005-10-31 12:03
银牌会员 发帖 790 积分 2,227
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 ]
第6楼 sglxy 发表于 2005-10-31 12:56
中级用户 发帖 87 积分 397
谢谢"本是"兄弟的答复,但是我还有个问题,请看:

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

如果这样改过后的语法是不是有点别扭?
第7楼 willsort 发表于 2005-10-31 14:16
元老会员 发帖 1,512 积分 4,432
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 片断。
第8楼 本是 发表于 2005-10-31 16:36
银牌会员 发帖 790 积分 2,227
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 ]
第9楼 sglxy 发表于 2005-10-31 18:27
中级用户 发帖 87 积分 397
非常感谢两位高手的指点,这个批处理是我制作的隐藏分区自动恢复功能的一段,方法是先:运行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楼 Archimonde 发表于 2005-11-01 13:37
新手上路 发帖 2 积分 3
个人有个编程习惯,就是在出错语句的前面将它调用的参数一一显示一下,不知道你尝试过没有
第11楼 willsort 发表于 2005-11-02 12:55
元老会员 发帖 1,512 积分 4,432
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%] 查看其输出结果是否正常。如果这个结果正常,那问题可能处在其它语句中。
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023