批处理 不用回车,直接确认键入的实例 疑问

@echooff&setlocalechoq|debug>nul>nul(chcp437&graftabl936)echo选项"1"echo选项"2"echo请按键选择:... @echo off & setlocal

echo q|debug>nul
>nul (chcp 437&graftabl 936)
echo 选项"1"
echo 选项"2"
echo 请按键选择:
echo %errorlevel%
(echo e100 CD 16 B4 4C CD 21&echo g&echo q)|debug>nul
set e=%errorlevel%

cls

echo %errorlevel%
pause
>nul (chcp 437&graftabl 936)
if %e%==49 echo 您按下的是1
if %e%==50 echo 您按下的是2

pause

这是我在网上找的 示例

直接按1不用回车就直接往下执行
变量errorlevel的值就自动取49
从而直接选择了 if %e%==49 echo 您按下的是1

我有很多疑问
1.echo q|debug>nul 中 >nul 是什么意思?
2.第一个 >nul (chcp 437&graftabl 936) 是什么意思?
3.(echo e100 CD 16 B4 4C CD 21&echo g&echo q)|debug>nul 是什么意思?
4.第二个 >nul (chcp 437&graftabl 936) 是什么意思?
5.此例 批处理是什么时候接受键入的?
6.变量errorlevel是windows定义的还是 cmd外壳定义的?为此我故意加了两行echo %errorlevel% 来回显errorlevel的值变化,初始值为0,选空格为32,选1为49,选a为97,发现即各个字符的ascii码。问题是它的值是如何得来的?
展开
 我来答
百度网友bc7754810
2011-08-27 · TA获得超过564个赞
知道小有建树答主
回答量:311
采纳率:0%
帮助的人:437万
展开全部
1. >nul 意思就是把输出重定向到 nul ,而不是显示出来。

2. chcp是更改字符集代码页,graftabl是更改图形模式字符集代码页。这个组合的作用可能就是刷新一下命令行窗口的显示格式。

3. 相当于在 debug 中输入3行命令:“e100 CD 16 B4 4C CD 21”、“g”、“q”。

4. 应该跟上面同样的一个意思一样。

5. debug 中输入命令 g 后。

6. %errorlevel% 应该是由 cmd 定义的,等于在 cmd 下运行的上一个程序的返回值。
debug中“e100 CD 16 B4 4C CD 21”输入了一个小 DOS 程序,我猜这个程序的作用就是把键盘输入的一个字符的 ASCII 码作为返回值并退出。于是后面就可以用 %errorlevel% 来引用了。
yyykkkyyyy
2011-08-27 · TA获得超过3136个赞
知道大有可为答主
回答量:2691
采纳率:40%
帮助的人:3282万
展开全部
呵呵,这个批处理要是我还写不出来呢,也算是到此学了一招。测试一下大致能明白意思,楼上的解释的很正确,我再补充一下,并改写了一段(用的是xp系统),比较后更能说明原各行作用
@echo off & setlocal
echo q|debug>nul
graftabl 936>nul
:r
echo 选项提示...
echo 请按键选择(0-9):
(echo e100 CD 16 B4 4C CD 21&echo g&echo q)|debug>nul
set e=%errorlevel%
cls
if %e% geq 48 if %e% lss 58 (
set/a e-=48
call echo 您按下的是%%e%%
goto next)
goto r
:next
pause
以下补充解释一下所提问题
echo q|debug>nul
(>nul就不解释了)是开启一次debug,其中q是debug的退出命令,就是说什么也没做,但它会把代码页给换成437
第一个 >nul (chcp 437&graftabl 936)
把代码页给换回936,对比我的代码可知,它不必要chcp 437——至少xp下是如此 (楼主应该在命令行看各自帮助信息)
请注意,这时如果再次开启debug退出后就不会换代码页了,由此可见,第一个的作用就是保留屏幕原有信息不会因更换代码页而丢失,
因此第二个>nul (chcp 437&graftabl 936)就是不必要的了
.(echo e100 CD 16 B4 4C CD 21&echo g&echo q)|debug>nul 这句楼上网友已解释了,debug工具还能编写短小的.com程序呢,要弄懂它,得会汇编语言(呵呵我原来接触了一点现都忘光了)显然,暂停、接收键盘一次输入以及把输入键的ascii码作为返回码都在其中进行的,还有一些不想让看到的信息都被>nul和后面的cls给屏蔽和闪过去了
关于 %errorlevel% 原DOS系统是上一句命令或程序执行后的返回码,不同的命令或程序提供的返回码不同,但一般的 0 是表示正常执行后的返回码,所以楼主说先测试的初始值的说法是不妥的(它总是表述的上一命令执行后的值)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式