标题: [文本处理] [已解决]choice的一个问题 [打印本页]
作者: pZjVa0 时间: 2013-7-25 22:51 标题: [已解决]choice的一个问题
本帖最后由 pZjVa0 于 2013-7-27 20:26 编辑
- @echo off
- echo 1.hello!
- echo 2.damne it.
- choice.exe /n /c 12
-
- if %ERRORLEVEL% equ 1 (
- set p text=用户自定义输入:
- echo %text%
- pause
-
- if %ERRORLEVEL% equ 2 (
- set abc=11559988552233
- echo %abc%
- pause
复制代码
无论是选择1或者2,都回出现提示- ECHO 处于关闭状态。
- 请按任意键继续. . .
复制代码
这个问题应该怎么解决
作者: pZjVa0 时间: 2013-7-25 22:52
回复 2# CrLf
回复 3# batman
作者: CrLf 时间: 2013-7-26 00:38
本帖最后由 CrLf 于 2013-7-26 03:03 编辑
1、( 要与 ) 配对
2、%var% 在解析语法的时候就被展开了,此时还没有执行赋值
3、echo %text% 最好写成 echo;%text% 或者 echo,%text% 之类的防止变量为空导致意外输出,最通用的是 echo(%text%,这里的 ( 不需要配对的 ),比较怪异,但是兼容性最强
4、建议对代表复合语句的成对括号中的内容缩进以便识别层次,这是约定俗成的好习惯,比如写成类似下面这样的格式:- if xxx (
- if xxx (
- for xxx do (
- xxx
- )
- ) else (
- xxx
- )
- )
复制代码
改成这样就对了:- @echo off
- setlocal enabledelayedexpansion
-
- echo 1.hello!
- echo 2.damne it.
- choice.exe /n /c 12
-
- if %ERRORLEVEL% equ 1 (
- set /p text=用户自定义输入:
- echo;!text!
- pause
- )
- if %ERRORLEVEL% equ 2 (
- set abc=11559988552233
- echo;!abc!
- pause
- )
复制代码
作者: pZjVa0 时间: 2013-7-26 01:30
回复 3# CrLf
晚上惊现大神。虽然暂时不太懂,但愿意慢慢尝试。
作者: pZjVa0 时间: 2013-7-26 01:33
回复 3# CrLf
顺便问多一句,这是不是唯一的方法?因为程序下面我可能还要编写其他代码,包含有变量延迟等的语句,我怕全部修改起来难度有点大。
作者: pZjVa0 时间: 2013-7-26 01:49
回复 3# CrLf
07行漏了个p
我测试了一下你给的代码可是还是出错,是不是我打开的方式有问题?- 1.hello!
- 2.damne it.
- 1
- 用户自定义输入: fffffff
- !text!
- 请按任意键继续. . .
复制代码
作者: CrLf 时间: 2013-7-26 03:11
3楼的变量延迟方案已修改,没注意你的 set /p 写成了 set p
至于除了 3 楼代码以外的方案,我以部分代码举几个栗子
这个是用 call 代替变量延迟的方案,但不像变量延迟那样通用和高效:- if %ERRORLEVEL% equ 2 (
- set abc=11559988552233
- call echo;%%abc%%
- pause
- )
复制代码
其实只为了显示变量的话,临时开闭变量延迟是最好的选择:- if %ERRORLEVEL% equ 2 (
- set abc=11559988552233
- setlocal enabledelayedexpansion
- echo;!abc!
- endlocal
- pause
- )
复制代码
简短的折中方案,代码短且通用,但效率低:- if %ERRORLEVEL% equ 2 (
- set abc=11559988552233
- cmd /v /c echo;!abc!
- pause
- )
复制代码
还有其他的办法,但这三个是比较推荐的
作者: pZjVa0 时间: 2013-7-26 09:10
回复 7# CrLf
是不是之后的代码全部要改成复制代码
的形式呢?
会有很不方便的感觉
作者: pZjVa0 时间: 2013-7-27 12:29
回复 7# CrLf
choice除了可以使用这种形式判断外复制代码
还有其他方法吗?可以不影响到echo %%输出的
作者: CrLf 时间: 2013-7-27 15:12
回复 8# pZjVa0
原来的语法不对,你怎么改不都是得全部改掉?变量延迟很好嘛,再给你俩方案
方案一,把设置变量和显示变量拆开:- if %ERRORLEVEL% equ 2 (
- set abc=11559988552233
- )
- if %ERRORLEVEL% equ 2 (
- echo %abc%
- pause
- )
复制代码
方案二,调用函数来显示,比 call echo %%abc%% 通用,也比内嵌变量延迟简短:- if %ERRORLEVEL% equ 2 (
- set abc=11559988552233
- call echo abc
- pause
- )
-
- exit
- :echo
- setlocal enabledelayedexpansion
- echo;!%1!
- exit/b
复制代码
作者: pZjVa0 时间: 2013-7-27 18:56
回复 10# CrLf
你应该看到信息中的那段代码,我不想把它贴出来,我现在的思路是改变choice的判断方式,是否可以不使用ERRORLEVEL来用choice进行判断?
作者: CrLf 时间: 2013-7-27 19:00
choice 的结果只能用 errorlevel 判断
作者: CrLf 时间: 2013-7-27 19:12
本帖最后由 CrLf 于 2013-7-27 19:15 编辑
顺便说下,忽然想起来顶楼那样使用 choice 是有问题的,命令在运行中很可能改变了 errorlevel 导致执行了意外的代码。
choice 的标准用法是这样的:- @echo off
- choice /c abc
- if errorlevel 3 goto :sub3
- if errorlevel 2 goto :sub2
- if errorlevel 1 goto :sub1
- ::判断的顺序必须是降序
-
- echo 用户中断了输入,choice 未取得字符
- pause&exit /b
-
- :sub1
- echo 输入了 a
- pause&exit /b
-
- :sub2
- echo 输入了 b
- pause&exit /b
-
- :sub3
- echo 输入了 c
- pause&exit /b
复制代码
这例子够通俗了,照着改改吧...
贴了这么多方案,不懂楼主为什么一个个都不满意,你到底想达到什么效果,我总不能改变批处理的语法吧?
以后有要求尽量在顶楼一次性说清楚,避免长篇版聊浪费时间,此贴本人不再回复。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |