Board logo

标题: [文件操作] 批处理for /l 循环异常退出的小问题 [打印本页]

作者: 3351321147    时间: 2023-10-29 20:21     标题: 批处理for /l 循环异常退出的小问题

我在批处理里进行读取文件内容操作,有需求for /l 循环10次,有时候好好的10次,但是不知原因会出现%i然后下次就退出循环,比如,循环到4,5变成了%i,6就没了。
作者: 77七    时间: 2023-10-29 20:35

请把代码发出来看看
作者: 3351321147    时间: 2023-10-29 21:32

本帖最后由 3351321147 于 2023-10-29 21:59 编辑

回复 2# 77七


    有第三方命令,speak echox
    使用话需要,改下txt文件位置
  1. @echo off
  2. :+ spaek 朗读文本
  3. set txt="C:\Users\33513\Desktop\English.txt"
  4. setlocal ENABLEDELAYEDEXPANSION
  5. echo.&echo.&title %~n0 & echo. 单词拼写 & echo.
  6. :: 存储选择的天数记录行数1选择的2下一个
  7. set day1=
  8. set day2=
  9. :: boolean判断是否选择了,name是选择的天数
  10. set boolean=false
  11. set name=
  12. :: 单词数量记录
  13. set /a munF=0
  14. : forS
  15. :: 循环英语列表然后将bay输出供选择
  16. for /f "tokens=1-9 delims=:" %%a in ('type %txt% ^| findstr /n ".*day"') do (
  17. :: %%a 是行号,%%b是天数bay
  18. set i=%%b
  19. set i=!i:~0,1!!
  20. if !boolean! EQU true set day2=%%a & goto forF
  21. if not defined name (
  22. if 0 EQU  !munF! (set  munF=%%a) else (
  23. set /a "munF=%%a - !munF! -1"
  24. echox -fc " 单词量: !munF!"
  25. set munF=%%a
  26. )
  27. echox -n " %%b"
  28. ) else if !name! EQU !i! (
  29. set boolean=true
  30. set day1=%%a
  31. )
  32. )
  33. echox -fc " 单词量: 0"
  34. if !boolean! EQU true goto forF
  35. echo x退出
  36. echo.请输入天数的数字:
  37. set /p name=数字:
  38. if /i %name% EQU x exit
  39. goto forS
  40. :forF
  41. :: 循环考研10次
  42. set a=0
  43. for /L %%a in (1,1,10) do (
  44. : s
  45. :: 通过计算将随机数设置在指定行号之间
  46. set /a "s=!random! %%(%day2%-%day1%-1)"
  47. :: 判断重复,小判断
  48. if !a! EQU !s! (goto s) else (set a=!s!)
  49. echo.& echo.第%%a句
  50. call :dp !s!
  51. ) 2>nul
  52. goto del
  53. : dp
  54. :: 通过%1行号然后循环判断到%1行号后将单词与文本调用
  55. set name=%1
  56. set /a mundp=0
  57. for /f "skip=%day1% tokens=1,2 delims= " %%a in ('type %txt%') do (
  58. if !mundp! EQU !name! call :forFs %%a %%b& goto :eof
  59. set /a mundp+=1
  60. )
  61. :forFs
  62. start /i /b /min ""  speak -t %1
  63. echox -n 请输入英语: & echox -fc " %2"
  64. set /p yinyu=英语:
  65. if   /i "!yinyu!" EQU "%1" (goto true ) else (
  66. echox -fc "您输入有误: %1"
  67. speak -t %1
  68. goto false
  69. )
  70. goto forFs
  71. : true
  72. set /a muna+=1
  73. echox -fc 输入正确!
  74. goto :eof
  75. : false
  76. set /a munx+=1
  77. goto :eof
  78. : del
  79. if not defined muna set muna=0
  80. if not defined munx set munx=0
  81. set /a munMAX+=1
  82. echox -f9 " 当前正确数量: !muna!"
  83. echox -f9 " 当前错误数量: !munx!"
  84. echox -f9 " 当前执行次数: !munMAX!"
  85. if !munx! EQU 0 (echox -fd "恭喜你没错误完成了!!!") else echo 再接再厉
  86. pause >nul
  87. %0
复制代码

作者: 3351321147    时间: 2023-10-29 21:33

本帖最后由 3351321147 于 2023-10-29 21:46 编辑

回复 3# 3351321147


    文本
  1. 1day
  2. i 我
  3. my 我的
  4. like 喜欢
  5. you 你
  6. your 你的
  7. mother 母亲
  8. father 父亲
  9. dog 狗
  10. cat 猫
  11. book 书
  12. student 学生
  13. teacher 老师
  14. 2day
  15. red 红色
  16. green 绿色
  17. blue 蓝色
  18. black 黑色
  19. white 白色
  20. big 大
  21. small 小
  22. room 房间
  23. we 我们
  24. our 我们的
  25. phone 手机
  26. house 房子
  27. computer 电脑
  28. Ther 他们
  29. their 他们的
  30. 3day
复制代码

作者: 3351321147    时间: 2023-10-29 21:34

本帖最后由 3351321147 于 2023-10-29 22:04 编辑

[img][/img]回复 4# 3351321147
  1.     :forF
  2. :: 循环考研10次
  3. set a=0
  4. for /L %%a in (1,1,10) do (
  5.         : s
  6.         :: 通过计算将随机数设置在指定行号之间
  7.         set /a "s=!random! %%(%day2%-%day1%-1)"
  8.         :: 判断重复,小判断
  9.         if !a! EQU !s! (goto s) else (set a=!s!)
  10.         echo.& echo.第%%a句
  11.         call :dp !s!
  12. ) 2>nul
复制代码
是这部分,会出现%a退出情况
作者: 77七    时间: 2023-10-29 22:22

本帖最后由 77七 于 2023-10-29 22:25 编辑

回复 5# 3351321147


     试试把语句内的注释去掉,或者改为rem
还有不要在括号内写标签
作者: 3351321147    时间: 2023-10-30 07:49

本帖最后由 3351321147 于 2023-10-30 07:58 编辑

谢谢大佬,我把标签取消了,记录了选择单词总量,重复加1,超出换1,没有出现上述问题,谢谢
为什么循环里不要用标签,和注释大佬。
作者: 77七    时间: 2023-10-30 08:56

本帖最后由 77七 于 2023-10-30 09:09 编辑

回复 7# 3351321147


  1. @echo off
  2. for %%a in (1 2) do (
  3.         echo %%a
  4.         :: 123
  5. )
  6. pause
复制代码
::这个注释用在语句内有时候会导致闪退,比如上面的代码

标签,从括号内往外跳可以,不能跳到括号内。
大概就是前辈们的经验,我也不知道为什么。
作者: Five66    时间: 2023-10-30 17:27

http://www.bathome.net/post.php? ... p;extra=&page=2




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2