Board logo

标题: [文本处理] 请大侠帮我完美解决代码 [打印本页]

作者: marya    时间: 2017-11-29 10:36     标题: 请大侠帮我完美解决代码

有个批处理,里面有很多功能,单独执行完某项就跳回主菜单,我想加入个设置向导,将选出来的功能输出到文本,然后再执行,需要的时候可以再次执行。

1.设置向导输出文本a.txt格式如下:
  1. 功能abc,中文名称
  2. 功能def,中文名称
  3. 功能hij,中文名称
复制代码
2.执行文本功能代码如下:
  1. :main
  2. for /f "delims=, tokens=1,2" %%i in (a.txt) do (goto %%i & echo %%j)
复制代码
3. 然后在具体功能项加入如下代码,将a.txt执行过的行先删除,然后再跳转回第2项继续:(下面是功能abc的)
  1. findstr /v "功能abc" "a.txt">b.txt && del /q a.txt && ren "b.txt" "a.txt" && goto main
复制代码
小弟初学,水平有限,但总觉得这样不完美,可不可省略第3项或只写goto main跳转回第2项,改良第2项就行?
作者: hlzj88    时间: 2017-11-29 18:13

能帮就帮
  1. :main
  2. rem  假设功能abc那一列的数据都是不一样的
  3. pause
  4. for /f "delims=, tokens=1,2" %%i in (a.txt) do (
  5.     echo 将要执行%%j
  6.   pause或者ping延时
  7.     findstr /i "%%i" a.txt>>已执行.txt
  8.     findstr /v "%%i" a.txt>>b.txt
  9.     move /y b.txt a.txt
  10.     goto %%i
  11. )
  12. :功能abc
  13. ……
  14. goto main
  15. :功能def
  16. ……
  17. goto main
  18. 类推
  19. (另:假设将 功能abc(类推) 单独建为bat,可以把for里的goto修改为start)
复制代码

作者: slore    时间: 2017-11-30 00:10

本帖最后由 slore 于 2017-11-30 00:13 编辑
  1. @echo off
  2. set batchmode=0
  3. :main
  4. rem menu
  5. if "%batchmode%"=="1" goto :EOF
  6. echo ===============================
  7. echo 1.功能abc
  8. echo 2.功能def
  9. echo 3.根据a.txt定义批量执行
  10. set /p mode=请选择:
  11. if "%mode%"=="1" goto :功能abc
  12. if "%mode%"=="2" goto :功能def
  13. if "%mode%"=="3" goto :BATCH_MODE
  14. pause
  15. exit 0
  16. :功能abc
  17. echo RUN-功能abc
  18. goto main
  19. :功能def
  20. echo RUN-功能def
  21. goto main
  22. :BATCH_RUN
  23. goto %1
  24. echo 其实不会运行到这里,这行和下一行可以不写
  25. goto :EOF
  26. :BATCH_MODE
  27. set batchmode=1
  28. for /f "delims=, tokens=1,2" %%i in (a.txt) do (
  29.     echo 将要执行%%j
  30.     call :BATCH_RUN %%i
  31. )
  32. set batchmode=0
  33. goto main
复制代码
a.txt不用反复修改。相当于你的执行模板,可以写很多份,或者当input的参数输入,用起来方便些吧。
作者: marya    时间: 2017-11-30 09:59

本帖最后由 marya 于 2017-11-30 15:27 编辑

回复 3# slore


    三楼的不是很懂,我先网上找找资料理解,找不到再问你。
    测试可以,这个不用临时文件?貌似较理想!

    二楼的思路跟我的类似,比我的好,试过可行!

作者: marya    时间: 2017-11-30 15:23

本帖最后由 marya 于 2017-11-30 15:27 编辑

回复 2# hlzj88

比我的好,试过可行!谢谢!!!
作者: slore    时间: 2017-11-30 18:26

回复 4# marya
  1. @echo off
  2. set batchmode=0
  3. :main
  4. rem menu
  5. if "%batchmode%"=="1" goto :EOF
  6. echo ===============================
  7. echo 1.功能abc
  8. echo 2.功能def
  9. echo 3.根据a.txt定批量行
  10. set /p mode=選択:
  11. if "%mode%"=="1" goto :功能abc
  12. if "%mode%"=="2" goto :功能def
  13. if "%mode%"=="3" goto :BATCH_MODE
  14. pause
  15. exit 0
  16. :功能abc
  17. echo RUN-功能abc
  18. goto main
  19. :功能def
  20. echo RUN-功能def
  21. goto main
  22. :BATCH_MODE
  23. set batchmode=1
  24. for /f "delims=, tokens=1,2" %%i in (a.txt) do (
  25.     echo 将要行%%j
  26.     call :%%i
  27. )
  28. set batchmode=0
  29. goto main
复制代码
去掉了可能产生疑问的BATCH_RUN标签。

和你的想法还有2L的区别是 goto :%%i 变成了  call :%%i

这个把标签当作“函数”执行。
  1. @echo off
  2. set /a n=1
  3. call :test
  4. call :test
  5. call :test
  6. pause
  7. exit 0
  8. :test
  9. echo "test%n%"
  10. set /a n+=1
  11. goto :EOF
复制代码
将输出
test1
test2
test3

从 标签 到 "GOTO :EOF" 为函数的执行流程,走到goto :EOF后,回到call所在行,然后执行下面的语句。

用goto的话,是直接跳转过去,不回来。
作者: marya    时间: 2017-12-3 12:58

回复 6# slore


    谢谢啦




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