标题: [其他] [已解决]批处理接收变量问题 [打印本页]
作者: 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呢?
上代码:- @echo off
- color 0a
- :start
- chcp 65001
- echo=
- echo 1.查看本机用户信息
- echo 2.删除用户
- echo 3.添加用户
- echo 4.exit
- set /p num=请输入对应的数字:
- if %num% == 1 goto 1
- if %num% == 2 goto 2
- if %num% == 3 goto 3
- if %num% == 4 goto 4
- echo 输入错误,请重新输入!!!
- echo 3秒后自动跳回主菜单!!!
- ping 127.0.0.1 -n 2 >nul
- cls
- chcp 65001
- echo=
- echo 1.查看本机用户信息
- echo 2.删除用户
- echo 3.添加用户
- echo 4.exit
- echo 请输入对应的数字:
- echo 输入错误,请重新输入!!!
- echo 2秒后自动跳回主菜单!!!
- ping 127.0.0.1 -n 2 >nul
- cls
- chcp 65001
- echo=
- echo 1.查看本机用户信息
- echo 2.删除用户
- echo 3.添加用户
- echo 4.exit
- echo 请输入对应的数字:
- echo 输入错误,请重新输入!!!
- echo 2秒后自动跳回主菜单!!!
- ping 127.0.0.1 -n 2 >nul
- cls
- chcp 65001
- echo=
- echo 1.查看本机用户信息
- echo 2.删除用户
- echo 3.添加用户
- echo 4.exit
- echo 请输入对应的数字:
- echo 输入错误,请重新输入!!!
- echo 1秒后自动跳回主菜单!!!
- ping 127.0.0.1 -n 2 >nul
- cls & 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
复制代码
作者: 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
试试这样能否解决问题三:- @echo off
- :start
- echo 1.查看本机用户信息
- echo 2.删除用户
- echo 3.添加用户
- echo 4.exit
- set /p num=请输入对应的数字:
- if %num% == 1 goto 1
- if %num% == 2 goto 2
- if %num% == 3 goto 3
- if %num% == 4 goto 4
- echo 输入错误,请重新输入!!!
- echo 3秒后自动跳回主菜单!!!
- timeout /t 3
- cls
- 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 编辑
- @echo off
- :start
- cls&echo 1.查看本机用户信息&echo 2.删除用户&echo 3.添加用户&echo 4.exit&choice /c 1234 /n /m 输入选择:
- if %errorlevel%==1 net user&pause&goto start
- if %errorlevel%==2 set x=del&set y=删除
- if %errorlevel%==3 set x=add&set y=添加
- if %errorlevel%==4 exit
- set /p user=请输入需要%y%的用户名:
- 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 这个变量没有初始化赋值,例如这样试试:- @echo off
- :start
- echo 1.查看本机用户信息
- echo 2.删除用户
- echo 3.添加用户
- echo 4.exit
- set num=4
- set /p num=请输入对应的数字:
- if %num% == 1 goto 1
- if %num% == 2 goto 2
- if %num% == 3 goto 3
- if %num% == 4 goto 4
- echo 输入错误,请重新输入!!!
- echo 3秒后自动跳回主菜单!!!
- timeout /t 3
- cls
- goto start
复制代码
作者: Batcher 时间: 2020-8-7 23:42
回复 7# couse
加上双引号可以避免问题2的&字符导致出错:- @echo off
- :start
- echo 1.查看本机用户信息
- echo 2.删除用户
- echo 3.添加用户
- echo 4.exit
- set num=4
- set /p "num=请输入对应的数字:"
- if "%num%" == "1" goto 1
- if "%num%" == "2" goto 2
- if "%num%" == "3" goto 3
- if "%num%" == "4" goto 4
- echo 输入错误,请重新输入!!!
- echo 3秒后自动跳回主菜单!!!
- timeout /t 3
- cls
- goto start
复制代码
作者: smss 时间: 2020-8-7 23:58
复制代码
作者: couse 时间: 2020-8-8 00:24
回复 11# Batcher
非常感谢大佬的热心解答,经常测试加上双引号确实是可以避免接收到&导致脚本退出的问题,请问可以告知原理吗?我目前知道就是&符号在批处理中代表连接符,可以连接执行下一条命令,我这边简单的测试了一下,直接set a=&&echo %a% 结果输出的是%a%,另外测试 | < >则显示语法错误,这个语法错误我可以理解是这三个符号并非当成普通字符,而是被当初管道符和输入输出使用,但是set a=&没有报错,这个我有点想不明白
作者: smss 时间: 2020-8-8 00:46
- ::用^转义
- set "a=^&^|^<^>"
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |