[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]choice的一个问题

本帖最后由 pZjVa0 于 2013-7-27 20:26 编辑
  1. @echo off
  2. echo 1.hello!
  3. echo 2.damne it.
  4. choice.exe /n /c 12
  5. if %ERRORLEVEL% equ 1 (
  6. set p text=用户自定义输入:
  7. echo %text%
  8. pause
  9. if %ERRORLEVEL% equ 2 (
  10. set abc=11559988552233
  11. echo %abc%
  12. pause
复制代码
无论是选择1或者2,都回出现提示
  1. ECHO 处于关闭状态。
  2. 请按任意键继续. . .
复制代码
这个问题应该怎么解决
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 CrLf 于 2013-7-27 19:15 编辑

顺便说下,忽然想起来顶楼那样使用 choice 是有问题的,命令在运行中很可能改变了 errorlevel 导致执行了意外的代码。
choice 的标准用法是这样的:
  1. @echo off
  2. choice /c abc
  3. if errorlevel 3 goto :sub3
  4. if errorlevel 2 goto :sub2
  5. if errorlevel 1 goto :sub1
  6. ::判断的顺序必须是降序
  7. echo 用户中断了输入,choice 未取得字符
  8. pause&exit /b
  9. :sub1
  10. echo 输入了 a
  11. pause&exit /b
  12. :sub2
  13. echo 输入了 b
  14. pause&exit /b
  15. :sub3
  16. echo 输入了 c
  17. pause&exit /b
复制代码
这例子够通俗了,照着改改吧...
贴了这么多方案,不懂楼主为什么一个个都不满意,你到底想达到什么效果,我总不能改变批处理的语法吧?
以后有要求尽量在顶楼一次性说清楚,避免长篇版聊浪费时间,此贴本人不再回复。
1

评分人数

TOP

choice 的结果只能用 errorlevel 判断

TOP

回复 10# CrLf


    你应该看到信息中的那段代码,我不想把它贴出来,我现在的思路是改变choice的判断方式,是否可以不使用ERRORLEVEL来用choice进行判断?

TOP

回复 8# pZjVa0


    原来的语法不对,你怎么改不都是得全部改掉?变量延迟很好嘛,再给你俩方案
方案一,把设置变量和显示变量拆开:
  1. if %ERRORLEVEL% equ 2 (
  2.    set abc=11559988552233
  3. )
  4. if %ERRORLEVEL% equ 2 (
  5.    echo %abc%
  6.    pause
  7. )
复制代码
方案二,调用函数来显示,比 call echo %%abc%% 通用,也比内嵌变量延迟简短:
  1. if %ERRORLEVEL% equ 2 (
  2.    set abc=11559988552233
  3.    call echo abc
  4.    pause
  5. )
  6. exit
  7. :echo
  8. setlocal enabledelayedexpansion
  9. echo;!%1!
  10. exit/b
复制代码

TOP

回复 7# CrLf


   

choice除了可以使用这种形式判断外
  1. if %ERRORLEVEL% equ 2
复制代码
还有其他方法吗?可以不影响到echo %%输出的

TOP

回复 7# CrLf


    是不是之后的代码全部要改成
  1. echo;!abc!
复制代码
的形式呢?

会有很不方便的感觉

TOP

3楼的变量延迟方案已修改,没注意你的 set /p 写成了 set p
至于除了 3 楼代码以外的方案,我以部分代码举几个栗子
这个是用 call 代替变量延迟的方案,但不像变量延迟那样通用和高效:
  1. if %ERRORLEVEL% equ 2 (
  2.    set abc=11559988552233
  3.    call echo;%%abc%%
  4.    pause
  5. )
复制代码
其实只为了显示变量的话,临时开闭变量延迟是最好的选择:
  1. if %ERRORLEVEL% equ 2 (
  2.    set abc=11559988552233
  3.    setlocal enabledelayedexpansion
  4.    echo;!abc!
  5.    endlocal
  6.    pause
  7. )
复制代码
简短的折中方案,代码短且通用,但效率低:
  1. if %ERRORLEVEL% equ 2 (
  2.    set abc=11559988552233
  3.    cmd /v /c echo;!abc!
  4.    pause
  5. )
复制代码
还有其他的办法,但这三个是比较推荐的

TOP

回复 3# CrLf


        07行漏了个p

我测试了一下你给的代码可是还是出错,是不是我打开的方式有问题?
  1. 1.hello!
  2. 2.damne it.
  3. 1
  4. 用户自定义输入: fffffff
  5. !text!
  6. 请按任意键继续. . .
复制代码

TOP

回复 3# CrLf


    顺便问多一句,这是不是唯一的方法?因为程序下面我可能还要编写其他代码,包含有变量延迟等的语句,我怕全部修改起来难度有点大。

TOP

回复 3# CrLf


    晚上惊现大神。虽然暂时不太懂,但愿意慢慢尝试。

TOP

本帖最后由 CrLf 于 2013-7-26 03:03 编辑

1、( 要与 ) 配对
2、%var% 在解析语法的时候就被展开了,此时还没有执行赋值
3、echo %text% 最好写成 echo;%text% 或者 echo,%text% 之类的防止变量为空导致意外输出,最通用的是 echo(%text%,这里的 ( 不需要配对的 ),比较怪异,但是兼容性最强
4、建议对代表复合语句的成对括号中的内容缩进以便识别层次,这是约定俗成的好习惯,比如写成类似下面这样的格式:
  1. if xxx (
  2.   if xxx (
  3.      for xxx do (
  4.         xxx
  5.      )
  6.   ) else (
  7.      xxx
  8.   )
  9. )
复制代码
改成这样就对了:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 1.hello!
  4. echo 2.damne it.
  5. choice.exe /n /c 12
  6. if %ERRORLEVEL% equ 1 (
  7.    set /p text=用户自定义输入:
  8.    echo;!text!
  9.    pause
  10. )
  11. if %ERRORLEVEL% equ 2 (
  12.    set abc=11559988552233
  13.    echo;!abc!
  14.    pause
  15. )
复制代码
1

评分人数

TOP

回复 2# CrLf
回复 3# batman

TOP

返回列表