无忧启动论坛
标题:
处理缺省值的问题
[打印本页]
作者:
quya
时间:
2018-1-29 10:09
标题:
处理缺省值的问题
本帖最后由 quya 于 2018-1-29 14:10 编辑
我最近编了个批处理, 从文本中读取缺省值并且由用户按键改变缺省值, 然后继续处理的例子。
以下是文本内容保存为setting.txt, 文本内容可以随意更改增删:
分区类型:GPT:MBR/GPT
系统分区:80G:60G/80G/100G
操作人员:王五:张三/李四/王五
恢复路径:\\xxx\c
恢复类型:普通
复制代码
第一个分隔符是":", 分割成 内容,缺省值,可选值
第二个分割符是“/”, 将可选内容分割开来
我的设想是当用户按数字键的时候,缺省值在可选择的值里面变动,按 0 则表示设好了值并继续, 按键的时候无需按回车键
以下是我的代码,编了差不多一整天,比较啰嗦。 我的问题是 1. 代码能否再简洁点? 2. 继续的键能否换成回车键?(第二个问题已解决)
@echo off
setlocal EnableDelayedExpansion
:menuloop
set /a number=1
set /a sum=0
cls
for /f "tokens=1-3 delims=:" %%i in (setting.txt) do (
set /a sum+=!number!
set "Options=%%k"
if not defined de!sum! set "de!sum!=%%j"
set "optemp=%%k"
set optemp="!optemp:/=" "!"
if defined Options (set "op!sum!=!optemp!") else set "op!sum!="%%j""
if defined Options (call echo !sum!. %%i %%de!sum!%% ^(可选:%%k^)) else call echo !sum!. %%i %%de!sum!%%
)
for /l %%a in (1,1,%sum%) do (
set /a number=1
set /a len%%a=0
call set "optemp=%%op%%a%%"
call set "detemp=%%de%%a%%"
for %%i in (!optemp!) do (
set /a len%%a+=!number!
if "!detemp!"==%%i set num%%a=!len%%a!
)
)
echo.
<nul set /p key=请按数字 1-%sum% 改变设置,0 继续
echo.
call :GetKey
if %key%==0 goto :next
if not defined len%key% goto :menuloop
call set "lentemp=%%len%key%%%"
call set "numtemp=%%num%key%%%"
call set "optemp=%%op%key%%%"
set/a mod=(%numtemp%+1)%%%lentemp%
if %mod%==0 set/a mod=%lentemp%
set /a number=1
set /a sum=0
for %%i in (%optemp%) do (
set /a sum+=!number!
if %mod%==!sum! set detemp=%%i
)
set de%key%=%detemp:"=%
goto :menuloop
:GetKey
set "key="
for /F "usebackq delims=" %%i in (`xcopy /w . 2^>NUL`) do (
if not defined key set "key=%%i"
)
set "key=%key:~-1%"
goto :eof
:next
echo.
echo 继续运行其他
echo.
echo 设定的值如下:
for /l %%a in (1,1,%sum%) do call echo %%de%%a%%
pause
goto :eof
复制代码
作者:
junyee
时间:
2018-1-29 13:16
choice.exe
作者:
quya
时间:
2018-1-29 13:25
本帖最后由 quya 于 2018-1-29 14:14 编辑
junyee 发表于 2018-1-29 13:16
choice.exe
choice不灵活,而且也不支持空值回车。 还要用“errorlevel”值来判断。
我这个Key子程序是参考了老外的替换choice的程序, 号称可以支持任何键包括回车,TAB等等, 但我试下来也不行, 可能是我姿势不对。
另, 刚才运行的时候直接敲了下回车,虽然key值取不到出错了,但却解决了我的第二个问题。
把代码
if %key%==0 goto :next
复制代码
换成了
if not defined key goto :next
复制代码
作者:
junyee
时间:
2018-1-29 18:58
嫌 choce 不够灵活,那就别用批处理吧.
还有 变量判断要加上符号比较好,如:
if '%key%'=='' dosmt
复制代码
作者:
tjmcl
时间:
2018-2-16 13:33
欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/)
Powered by Discuz! X3.3