无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4793|回复: 4
打印 上一主题 下一主题

[讨论] 处理缺省值的问题

[复制链接]
跳转到指定楼层
1#
发表于 2018-1-29 10:09:53 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 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
复制代码
5#
发表于 2018-2-16 13:33:59 | 只看该作者
回复

使用道具 举报

4#
发表于 2018-1-29 18:58:49 | 只看该作者
嫌 choce 不够灵活,那就别用批处理吧.

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

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


回复

使用道具 举报

3#
 楼主| 发表于 2018-1-29 13:25:20 | 只看该作者
本帖最后由 quya 于 2018-1-29 14:14 编辑


choice不灵活,而且也不支持空值回车。 还要用“errorlevel”值来判断。

我这个Key子程序是参考了老外的替换choice的程序, 号称可以支持任何键包括回车,TAB等等, 但我试下来也不行, 可能是我姿势不对。

另, 刚才运行的时候直接敲了下回车,虽然key值取不到出错了,但却解决了我的第二个问题。

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


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

使用道具 举报

2#
发表于 2018-1-29 13:16:44 | 只看该作者
choice.exe

点评

choice不灵活,而且也不支持空值回车。 还要用“errorlevel”值来判断。 我这个Key子程序是参考了老外的替换choice的程序, 号称可以支持任何键包括回车,TAB等等, 但我试下来也不行, 可能是我姿势不对。  详情 回复 发表于 2018-1-29 13:25
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-1 01:03

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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