Board logo

标题: 执行不成功: for /l %%a in (1 1 3) do >%%a.txt echo.%%a [打印本页]

作者: tireless     时间: 2008-12-12 10:37    标题: 执行不成功: for /l %%a in (1 1 3) do >%%a.txt echo.%%a
为什么这个批处理执行不成功,也没有任何错误提示:
@echo off
for /l %%a in (1 1 3) do >%%a.txt echo.%%a

换成这样却可以:
@echo off
for /l %%a in (1 1 3) do echo.%%a>%%a.txt

在 CMD 窗口中执行第一个批处理也没有问题:
g:\我的文档\桌面>for /l %a in (1 1 3) do >%a.txt echo.%a

g:\我的文档\桌面>echo.11>1.txt

g:\我的文档\桌面>echo.21>2.txt

g:\我的文档\桌面>echo.31>3.txt


发现 —— 把点去掉又可以:
for /l %%a in (1 1 3) do >%%a.txt echo %%a


为什么?

Last edited by tireless on 2008-12-12 at 13:09 ]

作者: HAT     时间: 2008-12-12 12:34
C:\Test>type test.bat
@echo off
for /l %%a in (1 1 3) do >%%a.txt echo.%%a

C:\Test>dir /b *.txt
File Not Found

C:\Test>test.bat

C:\Test>dir /b *.txt
1.txt
2.txt
3.txt

作者: tireless     时间: 2008-12-12 12:41    标题: RE #2
C:\>type test.bat
@echo off
for /l %%a in (1 1 3) do >%%a.txt echo.%%a
C:\>dir /b *.txt
找不到文件

C:\>test.bat

C:\>dir /b *.txt
找不到文件


最后一行要留空!为什么?
C:\>type test.bat
@echo off
for /l %%a in (1 1 3) do >%%a.txt echo.%%a

C:\>dir /b *.txt
找不到文件

C:\>test.bat

C:\>dir /b *.txt
1.txt
2.txt
3.txt


Last edited by tireless on 2008-12-12 at 12:48 ]

作者: wxcute     时间: 2008-12-12 12:58
真的很奇怪,可能与 for 的 /l 参数和重定向符号 > 有关。

作者: kissbill     时间: 2008-12-13 22:09
看来以后 ,DO后面代码还是加上括号的好

作者: s11ss     时间: 2008-12-14 00:37
MS只是批处理中重定向符号置前时有bug。

以下测试代码中的>con置后后没问题。

部分测试代码是(保存为单独的批处理运行):

>con cd
1、仅仅这一行,cd后面没有回车换行或其它字符。
运行后CMD中看不到命令本身,看不到当前路径的执行结果。根本就没执行cd。

2、在行末加回车换行。
运行后看到路径了!而且命令本身也显示出来了。

3、把回车换行改成空格或=或;等。
结果同上。但有的命令不能换成=或;等。


call >con cd
1、仅仅这一行,cd后面没有回车换行或其它字符。
可以清楚地看到CMD中命令本身显示为call 1>con,说明后面的cd被抛弃了,所以命令cd根本没执行,也就没有结果显示。

2、后面加回车或换行等。
正常显示命令本身和路径。


>con
不管后面加不加东西,都不显示命令本身。执行结果与以上的异常结果一样。




结论:
批处理中重定向符号置前时存在bug,即,如果行末的命令后没有了其它如空格或回车换行等的字符,那末在CMD重新解释该行时势必认为重定向符号的操作是最后的操作从而抛弃其它命令,也即不能正确解释该行命令。
最简单可靠的解决办法是,在最后加个空格。
——————
ps:
1、还可以测试<和>>,都有相同的问题。
2、由一个或一个以上的 &或&&或|| 连接的包含或不包含 重定向符号 的多个命令,若最后一个包含或不包含 重定向符号 的命令能单独执行成功则能保证整行执行成功。
如:(结果正常)
>con cd&echo.a&&echo.b||cd>con
再如:(结果异常)
cd>con&echo.a&&echo.b||>con cd(仅仅这一行,cd后面没有回车换行或其它字符)

Last edited by s11ss on 2008-12-14 at 00:53 ]

作者: Helloworld     时间: 2008-12-14 09:41
原来前置也有这样的bug...

作者: Li103Z     时间: 2009-1-11 19:14
收藏了,真的很不错.