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

[文件操作] 批处理for /l 循环异常退出的小问题

[复制链接]
发表于 2023-10-29 20:21:28 | 显示全部楼层 |阅读模式
我在批处理里进行读取文件内容操作,有需求for /l 循环10次,有时候好好的10次,但是不知原因会出现%i然后下次就退出循环,比如,循环到4,5变成了%i,6就没了。
发表于 2023-10-29 20:35:27 | 显示全部楼层
请把代码发出来看看
 楼主| 发表于 2023-10-29 21:32:43 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2023-10-29 21:33:14 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2023-10-29 21:34:54 | 显示全部楼层
本帖最后由 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退出情况
发表于 2023-10-29 22:22:09 | 显示全部楼层
本帖最后由 77七 于 2023-10-29 22:25 编辑

回复 5# 3351321147


     试试把语句内的注释去掉,或者改为rem
还有不要在括号内写标签
 楼主| 发表于 2023-10-30 07:49:57 | 显示全部楼层
本帖最后由 3351321147 于 2023-10-30 07:58 编辑

谢谢大佬,我把标签取消了,记录了选择单词总量,重复加1,超出换1,没有出现上述问题,谢谢
为什么循环里不要用标签,和注释大佬。
发表于 2023-10-30 08:56:05 | 显示全部楼层
本帖最后由 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
复制代码
::这个注释用在语句内有时候会导致闪退,比如上面的代码

标签,从括号内往外跳可以,不能跳到括号内。
大概就是前辈们的经验,我也不知道为什么。
发表于 2023-10-30 17:27:19 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 10:25 , Processed in 0.019980 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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