找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 33531|回复: 12

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

[复制链接]
发表于 2012-8-24 19:19:45 | 显示全部楼层 |阅读模式
题目出自【练习-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  
复制代码
执行结果为什么只显示第一行文本?

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-8-24 19:25:51 | 显示全部楼层
echo "!str!"

不在循环内
 楼主| 发表于 2012-8-24 19:37:39 | 显示全部楼层
回复 2# 狗屁不通
如何理解  不是在do 后面的()语句块内吗?
发表于 2012-8-24 19:50:18 | 显示全部楼层
回复 3# tianya1988



   貌似他说错了。

但是for里不能有goto的。for里是不能goto的。无论是goto到外面还是里面
 楼主| 发表于 2012-8-24 19:53:08 | 显示全部楼层
回复 4# canyuexiaolang
嗯 自己琢磨了下   隐隐感到是这个答案:for里面是否不能嵌套goto
发表于 2012-8-24 19:56:58 | 显示全部楼层
回复 5# tianya1988



   不过你可以call :label这样的形式来处理就好了
发表于 2012-8-24 20:14:15 | 显示全部楼层
我也感觉自己说错了
 楼主| 发表于 2012-8-24 20:19:25 | 显示全部楼层
回复 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
发表于 2012-8-24 20:31:49 | 显示全部楼层
回复 8# tianya1988

呵呵,你可以尝试换一种思路来解决。我看看你的思路看看能不能顺下去
发表于 2012-8-24 20:36:28 | 显示全部楼层
回复 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技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2012-8-24 20:55:34 | 显示全部楼层
回复 10# canyuexiaolang


    感谢  测试可行 能不能解释下
  1. call :check "%%i"
复制代码
怎么理解? 标签后带参数传递给call命令???
发表于 2012-8-24 20:57:54 | 显示全部楼层
回复 11# tianya1988

嗯。这种用法挺好用的。以空格分界,分别是%1 ~ %9,加引号的话代表一个
 楼主| 发表于 2012-8-24 21:01:01 | 显示全部楼层
call /?

  1.     CALL:label arguments

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 05:36 , Processed in 0.019574 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表