标题: [其他] [已解决]批处理for循环怎么只执行了一次? [打印本页]
作者: tianya1988 时间: 2012-8-24 19:19 标题: [已解决]批处理for循环怎么只执行了一次?
题目出自【练习-037】 http://www.bathome.net/thread-5584-1-1.html- @echo off
- Setlocal enabledelayedexpansion
- for /f "tokens=*" %%i in (a.txt) do (
- set "str=%%i"
- :check
- if "!str:~-1,1!"==" " set "str=!str:~0,-1!"&goto check
- echo "!str!"
- )
- pause
复制代码
我知道这样用goto执行效率不高 但在不考虑效率问题 就单执行结果来说为什么不正常?????
对于题目中的测试文本- amd cx qu
- k of woo is qmom
- jm ko ppp oe mie tnnn
- sis jb
复制代码
执行结果为什么只显示第一行文本?
作者: 狗屁不通 时间: 2012-8-24 19:25
不在循环内
作者: tianya1988 时间: 2012-8-24 19:37
回复 2# 狗屁不通
如何理解 不是在do 后面的()语句块内吗?
作者: canyuexiaolang 时间: 2012-8-24 19:50
回复 3# tianya1988
貌似他说错了。
但是for里不能有goto的。for里是不能goto的。无论是goto到外面还是里面
作者: tianya1988 时间: 2012-8-24 19:53
回复 4# canyuexiaolang
嗯 自己琢磨了下 隐隐感到是这个答案:for里面是否不能嵌套goto
作者: canyuexiaolang 时间: 2012-8-24 19:56
回复 5# tianya1988
不过你可以call :label这样的形式来处理就好了
作者: 狗屁不通 时间: 2012-8-24 20:14
我也感觉自己说错了
作者: tianya1988 时间: 2012-8-24 20:19
回复 6# canyuexiaolang
就本例来说 可否帮忙修改下代码达到效果?- @echo off
- Setlocal enabledelayedexpansion
- for /f "tokens=*" %%i in (a.txt) do (
- set "str=%%i"
- :check
- if "!str:~-1,1!"==" " set "str=!str:~0,-1!"&call :check
- echo "!str!"
- )
- pause
复制代码
这样执行效果还是一样的,只显示一行
其实对call这样的命令,没理解透彻有时用起来还是很恶心的。 call者类似与其他语言的函数调用 那这调用的结束(return)在哪????
把标签:check 放在循环体外??????- @echo off
- Setlocal enabledelayedexpansion
- for /f "tokens=*" %%i in (a.txt) do (
- set "str=%%i"
- call :check
- echo !str!>>result.txt
- )
- pause
-
- :check
- if "!str:~-1,1!"==" " set "str=!str:~0,-1!"
- goto :eof
复制代码
好像也不行 :Q
作者: canyuexiaolang 时间: 2012-8-24 20:31
回复 8# tianya1988
呵呵,你可以尝试换一种思路来解决。我看看你的思路看看能不能顺下去
作者: canyuexiaolang 时间: 2012-8-24 20:36
回复 8# tianya1988 - @echo off & setlocal enabledelayedexpansion
- for /f "tokens=*" %%i in (a.txt) do (
- call :check "%%i"
- echo "!str!"
- )
- pause & exit
-
- :check
- set "str=%~1"
- if "!str:~-1!"==" " (set "str=!str:~0,-1!" & call :check "!str!")
- goto :eof
复制代码
作者: tianya1988 时间: 2012-8-24 20:55
回复 10# canyuexiaolang
感谢 测试可行 能不能解释下复制代码
怎么理解? 标签后带参数传递给call命令???
作者: canyuexiaolang 时间: 2012-8-24 20:57
回复 11# tianya1988
嗯。这种用法挺好用的。以空格分界,分别是%1 ~ %9,加引号的话代表一个
作者: tianya1988 时间: 2012-8-24 21:01
call /?- CALL:label arguments
-
- 一个新的批文件上下文由指定的参数所创建,控制在卷标被指定
- 后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。
- 第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次
- 会退出批脚本。键入 GOTO /?,参看 GOTO :EOF 扩展的描述,
- 此描述允许您从一个批脚本返回。
复制代码
看的云里雾里?? 看来得多看看实例
再次感谢
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |