中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 执行不成功: for /l %%a in (1 1 3) do >%%a.txt echo.%%a
作者:
标题: 执行不成功: for /l %%a in (1 1 3) do >%%a.txt echo.%%a 上一主题 | 下一主题
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『楼 主』:  执行不成功: 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 ]

2008-12-12 10:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

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




2008-12-12 12:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 3 楼』:  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 ]

2008-12-12 12:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 4 楼』:  

真的很奇怪,可能与 for 的 /l 参数和重定向符号 > 有关。



┌───────┐
├→学习→实践→┤
└───────┘
2008-12-12 12:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kissbill
初级用户





积分 61
发帖 35
注册 2008-10-4
状态 离线
『第 5 楼』:  

看来以后 ,DO后面代码还是加上括号的好

   此帖被 +1 点积分    点击查看详情   
评分人:【 tireless 分数: +1  时间:2008-12-13 22:37


2008-12-13 22:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 6 楼』:  

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 ]

   此帖被 +15 点积分       点击查看详情   
评分人:【 kissbill 分数: +2  时间:2008-12-14 04:44
评分人:【 Helloworld 分数: +1  时间:2008-12-14 09:41
评分人:【 tireless 分数: +1  时间:2008-12-14 09:52
评分人:【 moniuming 分数: +11  时间:2009-1-11 19:43


2008-12-14 00:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Helloworld
新手上路





积分 9
发帖 9
注册 2008-11-29
状态 离线
『第 7 楼』:  

原来前置也有这样的bug...

2008-12-14 09:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Li103Z
初级用户





积分 70
发帖 38
注册 2007-5-23
状态 离线
『第 8 楼』:  

收藏了,真的很不错.

2009-1-11 19:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: