找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 65907|回复: 16

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

[复制链接]
发表于 2020-8-7 00:10:53 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码
发表于 2020-8-7 00:15:47 | 显示全部楼层
回复 1# couse


试试 Q-04 的方法能否解决第四个问题
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
发表于 2020-8-7 00:21:57 | 显示全部楼层
回复 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
复制代码
发表于 2020-8-7 18:01:20 | 显示全部楼层
本帖最后由 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编码
发表于 2020-8-7 19:03:13 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 1技术 +1 收起 理由
couse + 1 你这段代码让我学到了很多,非常感谢

查看全部评分

 楼主| 发表于 2020-8-7 22:51:46 | 显示全部楼层
回复 2# Batcher


    亲测有效,我没有留意到文本的编码是UTF-8,另存为ANSI编码打开正常显示中文,非常感谢!!!
 楼主| 发表于 2020-8-7 22:54:37 | 显示全部楼层
回复 3# Batcher


    timeout的效果还可以,谢谢大佬,另外请问一下第一和第二个问题大佬知道吗?其实我比较关心这两个问题
 楼主| 发表于 2020-8-7 22:58:09 | 显示全部楼层
回复 4# zhouzhiwei


    兄弟,你这个有点意思,学到了很多,非常感谢
 楼主| 发表于 2020-8-7 23:11:06 | 显示全部楼层
回复 5# smss


    大佬很强,你这个脚本优化很强,但是目前的我阅读起来还是有点困难,勉强能够看懂,一看就是老程序猿了,你知道我的第一和第二问题是什么原因导致的吗?如果不知道原因的话,以后用set设置接收输入变量还是会有这个问题,谢谢大佬了
发表于 2020-8-7 23:35:08 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1技术 +1 收起 理由
couse + 1 非常感谢你的耐心解答

查看全部评分

发表于 2020-8-7 23:42:30 | 显示全部楼层
回复 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
复制代码
发表于 2020-8-7 23:58:28 | 显示全部楼层
  1. 想太多导致的
复制代码
 楼主| 发表于 2020-8-8 00:24:19 | 显示全部楼层
回复 11# Batcher


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


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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 03:53 , Processed in 0.022111 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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