[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]批处理for循环怎么只执行了一次?

题目出自【练习-037】  http://www.bathome.net/thread-5584-1-1.html
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%i in (a.txt) do (
  4. set "str=%%i"
  5. :check
  6. if "!str:~-1,1!"==" " set "str=!str:~0,-1!"&goto check
  7. echo "!str!"
  8. )
  9. pause
复制代码
我知道这样用goto执行效率不高 但在不考虑效率问题 就单执行结果来说为什么不正常?????
对于题目中的测试文本
  1.      amd cx qu      
  2.         k of woo is qmom                 
  3.           jm ko    ppp     oe    mie    tnnn           
  4.       sis              jb  
复制代码
执行结果为什么只显示第一行文本?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

echo "!str!"

不在循环内

TOP

回复 2# 狗屁不通
如何理解  不是在do 后面的()语句块内吗?

TOP

回复 3# tianya1988



   貌似他说错了。

但是for里不能有goto的。for里是不能goto的。无论是goto到外面还是里面

TOP

回复 4# canyuexiaolang
嗯 自己琢磨了下   隐隐感到是这个答案:for里面是否不能嵌套goto

TOP

回复 5# tianya1988



   不过你可以call :label这样的形式来处理就好了

TOP

我也感觉自己说错了

TOP

回复 6# canyuexiaolang
就本例来说 可否帮忙修改下代码达到效果?
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%i in (a.txt) do (
  4. set "str=%%i"
  5. :check
  6. if "!str:~-1,1!"==" " set "str=!str:~0,-1!"&call :check
  7. echo "!str!"
  8. )
  9. pause
复制代码
这样执行效果还是一样的,只显示一行
其实对call这样的命令,没理解透彻有时用起来还是很恶心的。  call者类似与其他语言的函数调用  那这调用的结束(return)在哪????
把标签:check 放在循环体外??????
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%i in (a.txt) do (
  4. set "str=%%i"
  5. call :check
  6. echo !str!>>result.txt
  7. )
  8. pause
  9. :check
  10. if "!str:~-1,1!"==" " set "str=!str:~0,-1!"
  11. goto :eof
复制代码
好像也不行     :Q

TOP

回复 8# tianya1988

呵呵,你可以尝试换一种思路来解决。我看看你的思路看看能不能顺下去

TOP

回复 8# tianya1988
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in (a.txt) do (
  3.     call :check "%%i"
  4.     echo "!str!"
  5. )
  6. pause & exit
  7. :check
  8. set "str=%~1"
  9. if "!str:~-1!"==" " (set "str=!str:~0,-1!" & call :check "!str!")
  10. goto :eof
复制代码
1

评分人数

TOP

回复 10# canyuexiaolang


    感谢  测试可行 能不能解释下
  1. call :check "%%i"
复制代码
怎么理解? 标签后带参数传递给call命令???

TOP

回复 11# tianya1988

嗯。这种用法挺好用的。以空格分界,分别是%1 ~ %9,加引号的话代表一个

TOP

call /?
  1.     CALL:label arguments
  2. 一个新的批文件上下文由指定的参数所创建,控制在卷标被指定
  3. 后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。
  4. 第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次
  5. 会退出批脚本。键入 GOTO /?,参看 GOTO :EOF 扩展的描述,
  6. 此描述允许您从一个批脚本返回。
复制代码
看的云里雾里?? 看来得多看看实例   
再次感谢

TOP

返回列表