无忧启动论坛

标题: 处理缺省值的问题 [打印本页]

作者: quya    时间: 2018-1-29 10:09
标题: 处理缺省值的问题
本帖最后由 quya 于 2018-1-29 14:10 编辑

我最近编了个批处理, 从文本中读取缺省值并且由用户按键改变缺省值, 然后继续处理的例子。

以下是文本内容保存为setting.txt, 文本内容可以随意更改增删:

  1. 分区类型:GPT:MBR/GPT
  2. 系统分区:80G:60G/80G/100G
  3. 操作人员:王五:张三/李四/王五
  4. 恢复路径:\\xxx\c
  5. 恢复类型:普通
复制代码


第一个分隔符是":", 分割成 内容,缺省值,可选值
第二个分割符是“/”, 将可选内容分割开来

我的设想是当用户按数字键的时候,缺省值在可选择的值里面变动,按 0 则表示设好了值并继续, 按键的时候无需按回车键

以下是我的代码,编了差不多一整天,比较啰嗦。 我的问题是 1. 代码能否再简洁点?  2. 继续的键能否换成回车键?(第二个问题已解决)

  1. @echo off

  2. setlocal EnableDelayedExpansion


  3. :menuloop

  4. set /a number=1
  5. set /a sum=0

  6. cls

  7. for /f "tokens=1-3 delims=:" %%i in (setting.txt) do (

  8. set /a sum+=!number!

  9. set "Options=%%k"

  10. if not defined de!sum! set "de!sum!=%%j"

  11. set "optemp=%%k"

  12. set optemp="!optemp:/=" "!"

  13. if defined Options (set "op!sum!=!optemp!") else set "op!sum!="%%j""

  14. if defined Options (call echo !sum!. %%i %%de!sum!%% ^(可选:%%k^)) else call echo !sum!. %%i %%de!sum!%%

  15. )

  16. for /l %%a in (1,1,%sum%) do (

  17. set /a number=1
  18. set /a len%%a=0

  19. call set "optemp=%%op%%a%%"
  20. call set "detemp=%%de%%a%%"

  21. for %%i in (!optemp!) do (

  22. set /a len%%a+=!number!

  23. if "!detemp!"==%%i set num%%a=!len%%a!

  24. )
  25. )


  26. echo.

  27. <nul set /p key=请按数字 1-%sum% 改变设置,0 继续

  28. echo.

  29. call :GetKey

  30. if %key%==0 goto :next

  31. if not defined len%key% goto :menuloop

  32. call set "lentemp=%%len%key%%%"
  33. call set "numtemp=%%num%key%%%"
  34. call set "optemp=%%op%key%%%"

  35. set/a mod=(%numtemp%+1)%%%lentemp%

  36. if %mod%==0 set/a mod=%lentemp%


  37. set /a number=1

  38. set /a sum=0


  39. for %%i in (%optemp%) do (

  40. set /a sum+=!number!

  41. if %mod%==!sum! set detemp=%%i

  42. )

  43. set de%key%=%detemp:"=%

  44. goto :menuloop


  45. :GetKey
  46. set "key="
  47. for /F "usebackq delims=" %%i in (`xcopy /w . 2^>NUL`) do (
  48.   if not defined key set "key=%%i"
  49. )
  50. set "key=%key:~-1%"
  51. goto :eof

  52. :next

  53. echo.
  54. echo 继续运行其他
  55. echo.
  56. echo 设定的值如下:
  57. for /l %%a in (1,1,%sum%) do call echo %%de%%a%%


  58. pause

  59. 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值取不到出错了,但却解决了我的第二个问题。

把代码
  1. if %key%==0 goto :next
复制代码


换成了
  1. if not defined key goto :next
复制代码

作者: junyee    时间: 2018-1-29 18:58
嫌 choce 不够灵活,那就别用批处理吧.

还有 变量判断要加上符号比较好,如:

  1. if '%key%'=='' dosmt
复制代码



作者: tjmcl    时间: 2018-2-16 13:33





欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3