中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请大家指点一下,这个批处理那里错了
« [1] [2] »
作者:
标题: 请大家指点一下,这个批处理那里错了 上一主题 | 下一主题
willsort
元老会员

Batchinger


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

Re fan927:

      楼主在7楼10楼的else用法实际上是错误的。在cmd中else子句必须位于if子句的尾部之后,而尾部的标志是右圆括弧 ")",具体参见[1]。所以,楼主的else因为直接跟随在goto label之后而被忽略,所以是无效的。

      如果使用 f "%a%"=="dog" (goto dog) else goto pig 使else子句有效,则程序的流程分支将会不符合预期,即%a%不为dog即去goto pig,以后的if语句将均被忽略。

Re Wengier:

      if/goto样式和if/else样式的选择,实际上主要取决于个人的编写风格,比如从DOS Batch中成长的我,便喜欢使用goto样式的分支跳转,因为它具有更强的兼容性,而且这样的样式可以使我快速浏览代码中基本的分支流程,而不需要滚动和翻页。

      其它的选择理由还有一些,比如我不太喜欢每行语句的长度超过80个字符,这不仅仅是DOS下文本编辑器所带来的遗留习惯,主要是它可以增加阅读代码时的休息停顿频率,以提高代码的可阅读性。毕竟在大多数情况下,几个短句总是比一个等价的长句更易于理解。当然,if/else样式也可以改成短句型式,但是这样它就不再简洁了。

[1]引自cmd@WinXP的set命令行帮助信息

  Quote:
ELSE 子句必须在 IF 之后出现在同一行上。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

因为 del 命令需要用一个新行终止,以下子句不会有效:

IF EXIST filename. del filename. ELSE echo filename. missing

由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

如果都放在同一行上,以下子句有效:

    IF EXIST filename. (del filename.) ELSE echo filename. missing





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-5-29 19:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Wengier
系统支持

“新DOS时代”站长


积分 27734
发帖 10521
注册 2002-10-9
状态 离线
『第 17 楼』:  

Willsort:

其它理由我同意,不过如说到兼容性,那也是没有办法的。如果楼主是在编写DOS批处理文件的话,那自然要用DOS的语法,而且这也是我最常用到的。但是,楼主在一开头就用到了“SET /P”这种用法,显然这是不能在DOS下运行的,因此我当时就判定他是在编写NT脚本。因此,这也就无法再顾及对DOS下的兼容性了。而对于NT脚本来说,当然最好使用NT脚本中比较简洁的方法,而且if/else与goto相比似乎不是那么容易出错(如1楼中的错误)。



Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

2006-5-29 23:22
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (29206679)  编辑帖子  回复  引用回复
fan927
初级用户





积分 82
发帖 31
注册 2006-5-23
状态 离线
『第 18 楼』:  

多谢大家热情回复,这次应该是彻底搞定了


@echo off

:set
set /p a=请输入你的名字:
if "%a%"=="dog" (goto dog) else if "%a%"=="pig" (goto pig) else if "%a%"=="" (goto set) else goto err

:dog
echo 这是一只狗!
goto end

:pig
echo 这是一只猪!
goto end

:err
echo 输入错误!!
goto end

:end
set a=
goto set
pause>nul

2006-5-30 02:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 19 楼』:  

彻底搞定了?Really?恐怕言之过早了吧。
    不必说最后的end部分无法退出,最后一句pause.nul百无一用;也不必说三个标号段+if/else的结构是取二者之短,导致代码冗余度增加,可扩展性降低;单是出错处理,光靠一句else goto err是远远不够的。在set /p语句运行时,可以尝试输入以下各种字符:
    1.一个引号       "
    2.引号+双等号  "=="?"
   事实说明:革命尚未成功,同志仍需努力。期待你能综合前几楼之长,把这个脚本真正地搞定。

2006-5-30 12:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fan927
初级用户





积分 82
发帖 31
注册 2006-5-23
状态 离线
『第 20 楼』:  

多谢3742668版主,这样我认为可以了吧,我接触批处理也就半个月左右,您的指点我还一时理解不了,以后还请多多指教!

@echo off
:set
set a=
set /p a=请输入你的名字(可选dog,pig or end):
if "%a%"=="dog" (
goto dog
) else if "%a%"=="pig" (
goto pig
) else if "%a%"=="" (
goto set
) else if "%a%"=="end" (
goto end
) else goto err

:dog
echo 这是一只狗!
goto set

:pig
echo 这是一只猪!
goto set

:err
echo 输入错误!!
goto set

:end
pause

2006-5-30 15:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: