中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请问在这个批处理中为何%WHAT%的值无法正确传给其他变量?
作者:
标题: 请问在这个批处理中为何%WHAT%的值无法正确传给其他变量? 上一主题 | 下一主题
sglxy
中级用户

MS-DOS爱好者


积分 397
发帖 87
注册 2002-12-15
状态 离线
『楼 主』:  请问在这个批处理中为何%WHAT%的值无法正确传给其他变量?

最近我写了一个批处理程序,但是每执行到这一段就不对了:


*******************************
echo 你要恢复系统到哪一个分区(请输入分区号或盘符)?(123456789或DEFGHIJKL):
set WHAT=
what s
for %%a in (D E F G H I J K L) do IF [%%a]==[%WHAT%] goto _copy
for %%b in (1 2 3 4 5 6 7 8 9) do IF [%%b]==[%WHAT%] 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 [%%c]==[%WHAT%] 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 [%%a]==[%WHAT%] goto _copy
for %%b in (1 2 3 4 5 6 7 8 9) do IF [%%b]==[%WHAT%] set HDRV=1:%%b

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


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


[ Last edited by sglxy on 2005-11-1 at 23:51 ]

2005-10-29 20:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
sglxy
中级用户

MS-DOS爱好者


积分 397
发帖 87
注册 2002-12-15
状态 离线
『第 2 楼』:  

各位版主,有在线的吗?麻烦你们给看看,先谢谢了。

2005-10-29 22:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
sglxy
中级用户

MS-DOS爱好者


积分 397
发帖 87
注册 2002-12-15
状态 离线
『第 3 楼』:  

可惜,高手们都不在!

2005-10-30 19:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 4 楼』:  

试试将 [%WHAT%] 改为 [%%WHAT%%]



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2005-10-30 23:06
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 5 楼』:  

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
2005-10-31 12:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sglxy
中级用户

MS-DOS爱好者


积分 397
发帖 87
注册 2002-12-15
状态 离线
『第 6 楼』:  

谢谢"本是"兄弟的答复,但是我还有个问题,请看:

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

如果这样改过后的语法是不是有点别扭?

2005-10-31 12:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 7 楼』:  

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:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-10-31 14:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 8 楼』:  

willsort说的“
for %%a in (D E F G H I J K L) do IF [%%a]==[%WHAT%] 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
2005-10-31 16:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sglxy
中级用户

MS-DOS爱好者


积分 397
发帖 87
注册 2002-12-15
状态 离线
『第 9 楼』:  

非常感谢两位高手的指点,这个批处理是我制作的隐藏分区自动恢复功能的一段,方法是先:运行gdisk显示分区信息后,然后再手工输入要对哪一个分区进行操作。而what s命令将输入键值用%WHAT%变量传到for %%a in (D E F G H I J K L) do IF [%%a]==[%WHAT%] goto _copy中进行判断,如果是其中的一个则说明该分区没有被隐藏(分区隐藏后不会有盘符),我就可以对该分区安装上一些个性化的恢复功能。但是就是这个我自认为万无一失的方法偏偏得不到应有的结果,我现在不明白的是,为何for %%a in (D E F G H I J K L) do IF [%%a]==[%WHAT%] goto _copy这一句判断句会不起作用,我认为其语法应该没有错啊。
      另外请教一下“ 本是”老兄,在需要限定输入字符范围的情况下“what c”命令该如何书写(语法)?得到的结果是什么样的变量形式,应该如何对该变量进行操作? 请您举个例子,谢谢!

[ Last edited by sglxy on 2005-10-31 at 18:38 ]

2005-10-31 18:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Archimonde
新手上路





积分 3
发帖 2
注册 2005-11-1
状态 离线
『第 10 楼』:  

个人有个编程习惯,就是在出错语句的前面将它调用的参数一一显示一下,不知道你尝试过没有

2005-11-1 13:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

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:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-11-2 12:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: