Board logo

标题: [其他] [已解决]批处理接收变量问题 [打印本页]

作者: couse    时间: 2020-8-7 00:10     标题: [已解决]批处理接收变量问题

本帖最后由 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
复制代码

作者: Batcher    时间: 2020-8-7 00:15

回复 1# couse


试试 Q-04 的方法能否解决第四个问题
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
作者: Batcher    时间: 2020-8-7 00:21

回复 1# couse


试试这样能否解决问题三:
  1. @echo off
  2. :start
  3. echo 1.查看本机用户信息
  4. echo 2.删除用户
  5. echo 3.添加用户
  6. echo 4.exit
  7. set /p num=请输入对应的数字:
  8. if %num% == 1 goto 1
  9. if %num% == 2 goto 2
  10. if %num% == 3 goto 3
  11. if %num% == 4 goto 4
  12. echo 输入错误,请重新输入!!!
  13. echo 3秒后自动跳回主菜单!!!
  14. timeout /t 3
  15. cls
  16. goto start
复制代码

作者: zhouzhiwei    时间: 2020-8-7 18:01

本帖最后由 zhouzhiwei 于 2020-8-7 18:06 编辑

:: 关闭命令行回显
@echo off
:start
cls
echo 1.查看本机用户信息
echo 2.删除用户
echo 3.添加用户
echo 4.exit

@choice /c 1234 /m 请输入对应的数字:
echo cuowu:%errorlevel%
pause
if %errorlevel% == 1 (
        goto 1
) else if %errorlevel% == 2 (
        goto 2
) else if %errorlevel% == 3 (
        goto 3
) else if %errorlevel% == 4 (
        goto 4
) else (
        goto start
)

:1
net user
pause
cls
goto start

:2
set /p user=请输入需要删除的用户名:
net user %user% /del
pause
cls
goto start

:3
set /p user=请输入需要添加的用户名:
net user %user% /add
pause
cls
goto start

:4
exit
pause
乱码问题,脚本文件用GB2312编码
作者: smss    时间: 2020-8-7 19:03

本帖最后由 smss 于 2020-8-7 23:58 编辑
  1. @echo off
  2. :start
  3. cls&echo 1.查看本机用户信息&echo 2.删除用户&echo 3.添加用户&echo 4.exit&choice /c 1234 /n /m 输入选择:
  4. if %errorlevel%==1 net user&pause&goto start
  5. if %errorlevel%==2 set x=del&set y=删除
  6. if %errorlevel%==3 set x=add&set y=添加
  7. if %errorlevel%==4 exit
  8. set /p user=请输入需要%y%的用户名:
  9. net user %user% /%x%&pause&goto start
复制代码

作者: couse    时间: 2020-8-7 22:51

回复 2# Batcher


    亲测有效,我没有留意到文本的编码是UTF-8,另存为ANSI编码打开正常显示中文,非常感谢!!!
作者: couse    时间: 2020-8-7 22:54

回复 3# Batcher


    timeout的效果还可以,谢谢大佬,另外请问一下第一和第二个问题大佬知道吗?其实我比较关心这两个问题
作者: couse    时间: 2020-8-7 22:58

回复 4# zhouzhiwei


    兄弟,你这个有点意思,学到了很多,非常感谢
作者: couse    时间: 2020-8-7 23:11

回复 5# smss


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

回复 7# couse


问题1的原因是 num 这个变量没有初始化赋值,例如这样试试:
  1. @echo off
  2. :start
  3. echo 1.查看本机用户信息
  4. echo 2.删除用户
  5. echo 3.添加用户
  6. echo 4.exit
  7. set num=4
  8. set /p num=请输入对应的数字:
  9. if %num% == 1 goto 1
  10. if %num% == 2 goto 2
  11. if %num% == 3 goto 3
  12. if %num% == 4 goto 4
  13. echo 输入错误,请重新输入!!!
  14. echo 3秒后自动跳回主菜单!!!
  15. timeout /t 3
  16. cls
  17. goto start
复制代码

作者: Batcher    时间: 2020-8-7 23:42

回复 7# couse


加上双引号可以避免问题2的&字符导致出错:
  1. @echo off
  2. :start
  3. echo 1.查看本机用户信息
  4. echo 2.删除用户
  5. echo 3.添加用户
  6. echo 4.exit
  7. set num=4
  8. set /p "num=请输入对应的数字:"
  9. if "%num%" == "1" goto 1
  10. if "%num%" == "2" goto 2
  11. if "%num%" == "3" goto 3
  12. if "%num%" == "4" goto 4
  13. echo 输入错误,请重新输入!!!
  14. echo 3秒后自动跳回主菜单!!!
  15. timeout /t 3
  16. cls
  17. goto start
复制代码

作者: smss    时间: 2020-8-7 23:58

  1. 想太多导致的
复制代码

作者: couse    时间: 2020-8-8 00:24

回复 11# Batcher


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

  1. ::用^转义
  2. set "a=^&^|^<^>"
  3. echo %a%
复制代码

作者: couse    时间: 2020-8-8 00:55

回复 10# Batcher


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

回复 14# smss


    用转义这个方法我是知道的,其实最主要的是我想知道为什么会导致这个问题发生,可能我是个问题少年吧
作者: couse    时间: 2020-8-8 01:18

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

回复 11# Batcher


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




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2