Board logo

标题: [其他] 批处理echo输出为何显示“处于关闭状态”? [打印本页]

作者: winger_w    时间: 2010-12-22 17:44     标题: 批处理echo输出为何显示“处于关闭状态”?

本帖最后由 pcl_test 于 2016-11-16 09:35 编辑

代码如下:
  1. @echo off
  2. set /a loop=0
  3. :loop
  4. set /a loop+=1
  5. set input=%loop%
  6. echo %input%
  7. echo %input%>>a.txt
  8. pause
  9. goto loop
复制代码
运行结果:
1
2
echo处于关闭状态
...

实在不明白为什么会出现echo处于关闭状态。

[ 本帖最后由 winger_w 于 2010-12-22 19:16 编辑 ]
作者: Batcher    时间: 2010-12-22 19:19

  1. @echo off
  2. set /a loop=0
  3. :loop
  4. set /a loop+=1
  5. set input=%loop%
  6. echo,%input%
  7. >>a.txt echo,%input%
  8. pause
  9. goto :loop
复制代码

作者: winger_w    时间: 2010-12-22 19:24

请问能讲解一下为什么吗?
作者: winger_w    时间: 2010-12-22 19:41

主要是想知道那段问题代码为什么会有错误,能指点一下吗?
作者: mac007cn    时间: 2010-12-22 20:15

就是啊,挺奇怪的。2楼的给解释一下呗
作者: winger_w    时间: 2010-12-22 20:19

  1. @echo off
  2. set /a loop=0
  3. :loop
  4. set /a loop+=1
  5. >>a.txt echo %loop%
  6. pause
  7. goto :loop
复制代码
我刚试了,这样也能有正确的结果
但是还是不明白为什么写成echo %loop%>>a.txt就不行了
作者: Batcher    时间: 2010-12-22 20:37     标题: 回复 4楼 的帖子

你把@echo off删掉,再执行一遍看看吧。
作者: ithinkican    时间: 2010-12-22 22:55

请添加
setlocal enabledelayedexpansion
在set /a loop=0前面就不会出现"ECHO处于关闭状态…"了。
作者: hanyeguxing    时间: 2010-12-23 03:15

echo %input%>>a.txt
%input%的部分内容会成为>>的句柄而产生错误
作者: winger_w    时间: 2010-12-23 09:30     标题: 回复 8楼 的帖子

的确使用延迟扩展是没有问题,但是,
这里的echo %input%>>a.txt是一个完整的命令,input在执行扩展前已经被更新为新的值了,我觉得不存在延迟扩展的问题
作者: winger_w    时间: 2010-12-23 09:32     标题: 回复 9楼 的帖子

部分内容成为>>的句柄怎么理解?%input%在第二次循环时,内容就是2了~~~
作者: winger_w    时间: 2010-12-23 09:36

我又试了,这个应该是cmd的一个bug。
如果改成
  1. @echo off
  2. set /a loop=10
  3. :loop
  4. set /a loop+=1
  5. echo %loop%>>a.txt
  6. pause
  7. goto :loop
复制代码
得到的是正确的结果。
如果loop为个位数1,%loop%会被认为是" 1",前面有个空格,但是如果是两位数10,就被认为是"10",前面没有空格。。。。
当echo  1时(注意,1前面有两个空格),此时cmd会认为这句话就是echo,从而输出"echo处于关闭状态"。
作者: Batcher    时间: 2010-12-23 09:46     标题: 回复 12楼 的帖子

三个默认的句柄:
0代表标准输入
1代表标准输出
2代表出错




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2