Board logo

标题: [文本处理] [已解决]批处理ECHO.输出重定向为何出错? [打印本页]

作者: mxxcgzxxx    时间: 2011-5-17 21:18     标题: [已解决]批处理ECHO.输出重定向为何出错?

1、
  1. set file=1.txt
  2. set dat=asdfawefasfasdfasdf
  3. for /l %%1 in (1,1,10) do echo.>>%file%|echo %dat%>>%file%
  4. pause
复制代码
上边的句子我没有写错啊,但为什么echo.会多输出一个空格呢?各位帮我研究一下?
这是我程序中的一段,有空格会影响到全局的写入顺序。

2、
还有另一个问题我没研究出来也没办会用实例表示,就是先读取一个TXT,用echo %a%>>写入,结果不是另起一行而是接着最后一行后面写入,是为什么?
例:最后一行是1111,写入%a%=2222
结果文件最后一行变成11112222
而不是正常的
1111
2222
但不是全都这样而是有时这样是为什么?是否存在一个读取的指针呢?
如果是可以加以利用吗?
作者: qzwqzw    时间: 2011-5-17 21:25

echo.>>%file%|echo %dat%>>%file%
这句明显有问题
重定向>>与管道同时使用
给cmd带来疑问
第一句echo.是把输出重定向到%file%中
还是通过管道送到echo %dat%中呢?
作者: mxxcgzxxx    时间: 2011-5-17 21:32

是成功写入了文件但不是空行而是一个空格
就是一空格一行
另一行是%a%的值,如果使用了&替换|则没问题,但那个空格为什么会产生呢?
真的是命令冲突带来的新效应?
作者: mxxcgzxxx    时间: 2011-5-17 21:34

其实主要是问题2引起的,所以我不得不在输入%a%前加一个空行,以保证写入新的行,结果发现了新的问题呵
作者: CrLf    时间: 2011-5-17 21:45

本帖最后由 zm900612 于 2011-5-17 21:56 编辑

cmd进行预处理的时候,会将重定向挪到语句末尾,并在其后加上空格,若使用默认句柄1或0而未标明,则也会自动补足。而连接符&、&&、|、||在预处理的时候也会在前后各加一个空格(如果原先不存在),这样echo.>>%file%|echo %dat%>>%file%实际上是
“echo. 1>>1.txt  | echo asdfawefasfasdfasdf 1>>1.txt ”
这时候因为第一句echo不存在除重定向与空格之外的字符,所以大概是被划分成“echo. 1>>1.txt  ”而就输出了空格吧
解决方法,为echo加上括号,或者干脆不要用连接符
顺便一提,楼主如果用&我还可以理解,为什么重定向之后还要用通道呢?重定向是在通道之后被预处理的,也就是说,重定向比通道优先级高,使用了重定向,通道是没有作用的
作者: CrLf    时间: 2011-5-17 21:47

对问题2的猜测,原文本最后一行没有换行符
作者: CrLf    时间: 2011-5-17 21:50

其实这里说成优先级不太合适,这和预处理顺序上的优先级是相反的,越迟出现的,就越权威
作者: mxxcgzxxx    时间: 2011-5-17 21:51

本帖最后由 mxxcgzxxx 于 2011-5-17 21:53 编辑

5# zm900612


也是好玩才用通道的,没想到效果不同呵
原来是因为下面两句的效果不同才以为用通道重定向是一样的结果
  1. echo 123|echo 256|echo 789
  2. echo 123>>1.txt|echo 256>>1.txt|echo 789>>1.txt
复制代码

作者: mxxcgzxxx    时间: 2011-5-17 21:58

本帖最后由 mxxcgzxxx 于 2011-5-17 22:01 编辑

看来你对2的猜想是对的,我又试了一次
原来是最后一句没换行,而echo定完一句就会自动换行给外空行
所以如果用echo 123>>1.txt时下面两个文件效果是不同的
  1. 文件1
  2. 123
复制代码
  1. 文件2
  2. 123
  3. (空行)
复制代码
还有通道确实是给输入的字后面加上了空格。
两个问题都解决了!谢谢

确实我的原文本原来是用手写的,所以有的会出错有的不会出错!




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