[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]批处理接收变量问题

本帖最后由 couse 于 2020-8-8 20:14 编辑

小白刚学批处理没多久,刚学了if和goto命令,写了个系统账户管理的批处理,目前遇到几个问题,虚心求学不懂就问,希望大神可以解答一下疑惑,谢谢!!!

问题1:刚打开这个批处理在接收输入的状态下直接按回车,程序直接退出,如果第一次随便输入什么执行一次,第二次在接收输入的状态按回车则提示输入错误。

问题2:接收的变量只要出现符号 & ,回车后也直接退出,问题1和2我都自行百度过了,但是并没有找到相关问题,可能是我的搜索提问不够明确 -_-!

问题3:就是我这段代码的错误提示有个3秒的倒计时,我目前能想到的办法就是把这段报错代码复制粘贴3次,我觉得好像有点傻,不知道有没有别的办法优化一下^_^

问题4:我的是win10英文版系统,我打开批处理echo的中文显示乱码,然后百度了一下得知加上chcp 65001就可以正常显示中文,有没有其他的办法可以让我系统直接显示中文而不是加上chcp 65001呢?

上代码:
  1. @echo off
  2. color 0a
  3. :start
  4. chcp 65001
  5. echo=
  6. echo 1.查看本机用户信息
  7. echo 2.删除用户
  8. echo 3.添加用户
  9. echo 4.exit
  10. set /p num=请输入对应的数字:
  11. if %num% == 1 goto 1
  12. if %num% == 2 goto 2
  13. if %num% == 3 goto 3
  14. if %num% == 4 goto 4
  15. echo 输入错误,请重新输入!!!
  16. echo 3秒后自动跳回主菜单!!!
  17. ping 127.0.0.1 -n 2 >nul
  18. cls
  19. chcp 65001
  20. echo=
  21. echo 1.查看本机用户信息
  22. echo 2.删除用户
  23. echo 3.添加用户
  24. echo 4.exit
  25. echo 请输入对应的数字:
  26. echo 输入错误,请重新输入!!!
  27. echo 2秒后自动跳回主菜单!!!
  28. ping 127.0.0.1 -n 2 >nul
  29. cls
  30. chcp 65001
  31. echo=
  32. echo 1.查看本机用户信息
  33. echo 2.删除用户
  34. echo 3.添加用户
  35. echo 4.exit
  36. echo 请输入对应的数字:
  37. echo 输入错误,请重新输入!!!
  38. echo 2秒后自动跳回主菜单!!!
  39. ping 127.0.0.1 -n 2 >nul
  40. cls
  41. chcp 65001
  42. echo=
  43. echo 1.查看本机用户信息
  44. echo 2.删除用户
  45. echo 3.添加用户
  46. echo 4.exit
  47. echo 请输入对应的数字:
  48. echo 输入错误,请重新输入!!!
  49. echo 1秒后自动跳回主菜单!!!
  50. ping 127.0.0.1 -n 2 >nul
  51. cls & goto start
  52. :1
  53. net user
  54. pause
  55. cls
  56. goto start
  57. :2
  58. set /p user=请输入需要删除的用户名:
  59. net user %user% /del
  60. pause
  61. cls
  62. goto start
  63. :3
  64. set /p user=请输入需要添加的用户名:
  65. net user %user% /add
  66. pause
  67. cls
  68. goto start
  69. :4
  70. exit
  71. pause
复制代码

回复 2# Batcher


    亲测有效,我没有留意到文本的编码是UTF-8,另存为ANSI编码打开正常显示中文,非常感谢!!!

TOP

回复 3# Batcher


    timeout的效果还可以,谢谢大佬,另外请问一下第一和第二个问题大佬知道吗?其实我比较关心这两个问题

TOP

回复 4# zhouzhiwei


    兄弟,你这个有点意思,学到了很多,非常感谢

TOP

回复 5# smss


    大佬很强,你这个脚本优化很强,但是目前的我阅读起来还是有点困难,勉强能够看懂,一看就是老程序猿了,你知道我的第一和第二问题是什么原因导致的吗?如果不知道原因的话,以后用set设置接收输入变量还是会有这个问题,谢谢大佬了

TOP

回复 11# Batcher


    非常感谢大佬的热心解答,经常测试加上双引号确实是可以避免接收到&导致脚本退出的问题,请问可以告知原理吗?我目前知道就是&符号在批处理中代表连接符,可以连接执行下一条命令,我这边简单的测试了一下,直接set a=&&echo %a% 结果输出的是%a%,另外测试 | < >则显示语法错误,这个语法错误我可以理解是这三个符号并非当成普通字符,而是被当初管道符和输入输出使用,但是set a=&没有报错,这个我有点想不明白

TOP

回复 10# Batcher


    懂了,细想一下确实应该是这样,第一次运行的时候num没有值,直接回车程序便直接退出了,当我随便给num一个值之后,此时回车便报错,我这边也测试了一下,发现只要遇到if命令判断变量而变量没有被赋值的情况下,程序就会直接退出,由于是小白,所以很多东西都不懂,感谢大佬的虚心指导,真的非常感谢!!!

TOP

回复 14# smss


    用转义这个方法我是知道的,其实最主要的是我想知道为什么会导致这个问题发生,可能我是个问题少年吧

TOP

本帖最后由 couse 于 2020-8-8 01:33 编辑

回复 11# Batcher


    经常测试我知道为什么之前输&的时候程序就自动退出了,我发现set a=& 等效于 set a= ,此时a是个空变量,当遇到if命令用空变量作比较的时候,就会报语法错误,批处理在遇到错误命令的时候会返回一个错误信息,但是不会退出脚本,而是继续执行下面的命令,如果遇到的是语法错误则直接退出脚本,不再执行后面的命令,非常感谢各位解答了我所有的问题,感觉一下子学到了好多知识,希望大家共同进步!!!

TOP

返回列表