标题: [文本处理] 请大侠帮我完美解决代码 [打印本页]
作者: marya 时间: 2017-11-29 10:36 标题: 请大侠帮我完美解决代码
有个批处理,里面有很多功能,单独执行完某项就跳回主菜单,我想加入个设置向导,将选出来的功能输出到文本,然后再执行,需要的时候可以再次执行。
1.设置向导输出文本a.txt格式如下:- 功能abc,中文名称
- 功能def,中文名称
- 功能hij,中文名称
复制代码
2.执行文本功能代码如下:- :main
- for /f "delims=, tokens=1,2" %%i in (a.txt) do (goto %%i & echo %%j)
-
复制代码
3. 然后在具体功能项加入如下代码,将a.txt执行过的行先删除,然后再跳转回第2项继续:(下面是功能abc的)- 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
能帮就帮- :main
- rem 假设功能abc那一列的数据都是不一样的
- pause
- for /f "delims=, tokens=1,2" %%i in (a.txt) do (
- echo 将要执行%%j
- pause或者ping延时
- findstr /i "%%i" a.txt>>已执行.txt
- findstr /v "%%i" a.txt>>b.txt
- move /y b.txt a.txt
- goto %%i
- )
-
- :功能abc
- ……
- goto main
-
- :功能def
- ……
- goto main
-
- 类推
-
- (另:假设将 功能abc(类推) 单独建为bat,可以把for里的goto修改为start)
复制代码
作者: slore 时间: 2017-11-30 00:10
本帖最后由 slore 于 2017-11-30 00:13 编辑
- @echo off
-
- set batchmode=0
- :main
-
- rem menu
- if "%batchmode%"=="1" goto :EOF
- echo ===============================
- echo 1.功能abc
- echo 2.功能def
- echo 3.根据a.txt定义批量执行
- set /p mode=请选择:
-
- if "%mode%"=="1" goto :功能abc
- if "%mode%"=="2" goto :功能def
- if "%mode%"=="3" goto :BATCH_MODE
-
- pause
- exit 0
-
- :功能abc
- echo RUN-功能abc
- goto main
-
- :功能def
- echo RUN-功能def
- goto main
-
- :BATCH_RUN
- goto %1
- echo 其实不会运行到这里,这行和下一行可以不写
- goto :EOF
-
- :BATCH_MODE
- set batchmode=1
- for /f "delims=, tokens=1,2" %%i in (a.txt) do (
- echo 将要执行%%j
- call :BATCH_RUN %%i
- )
- set batchmode=0
- 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 - @echo off
-
- set batchmode=0
- :main
-
- rem menu
- if "%batchmode%"=="1" goto :EOF
- echo ===============================
- echo 1.功能abc
- echo 2.功能def
- echo 3.根据a.txt定批量行
- set /p mode=選択:
-
- if "%mode%"=="1" goto :功能abc
- if "%mode%"=="2" goto :功能def
- if "%mode%"=="3" goto :BATCH_MODE
-
- pause
- exit 0
-
- :功能abc
- echo RUN-功能abc
- goto main
-
- :功能def
- echo RUN-功能def
- goto main
-
- :BATCH_MODE
- set batchmode=1
- for /f "delims=, tokens=1,2" %%i in (a.txt) do (
- echo 将要行%%j
- call :%%i
- )
- set batchmode=0
- goto main
复制代码
去掉了可能产生疑问的BATCH_RUN标签。
和你的想法还有2L的区别是 goto :%%i 变成了 call :%%i
这个把标签当作“函数”执行。- @echo off
- set /a n=1
- call :test
- call :test
- call :test
- pause
- exit 0
-
- :test
- echo "test%n%"
- set /a n+=1
- 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 |