中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-11 03:37
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 执行不成功: for /l %%a in (1 1 3) do >%%a.txt echo.%%a 查看 1,144 回复 7
楼 主 执行不成功: for /l %%a in (1 1 3) do >%%a.txt echo.%%a 发表于 2008-12-12 10:37 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
为什么这个批处理执行不成功,也没有任何错误提示:
@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 ]
2 发表于 2008-12-12 12:34 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
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
3 RE #2 发表于 2008-12-12 12:41 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
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 ]
4 发表于 2008-12-12 12:58 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
20年会员
UID 59307
状态 离线
真的很奇怪,可能与 for 的 /l 参数和重定向符号 > 有关。
┌───────┐
├→学习→实践→┤
└───────┘
5 发表于 2008-12-13 22:09 ·  中国 天津 电信
初级用户
积分 61
发帖 35
注册 2008-10-04 13:00
17年会员
UID 127389
性别 男
状态 离线
看来以后 ,DO后面代码还是加上括号的好
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
tireless +1 2008-12-13 22:37
6 发表于 2008-12-14 00:37 ·  中国 北京 海淀区 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
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 ]
本帖最近评分记录 (共 4 条) 点击查看详情
评分人分数时间
kissbill +2 2008-12-14 04:44
Helloworld +1 2008-12-14 09:41
tireless +1 2008-12-14 09:52
moniuming +11 2009-01-11 19:43
7 发表于 2008-12-14 09:41 ·  中国 广东 江门 电信
新手上路
积分 9
发帖 9
注册 2008-11-29 18:01
17年会员
UID 132439
性别 男
状态 离线
原来前置也有这样的bug...
8 发表于 2009-01-11 19:14 ·  中国 广东 广州 天河区 电信
初级用户
积分 70
发帖 38
注册 2007-05-23 07:20
19年会员
UID 89024
性别 男
状态 离线
收藏了,真的很不错.
论坛跳转: