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

[数值计算] SET /P有没有办法只允许输入数字?

  1. @echo off
  2. title 延时关机
  3. mode con: cols=32 lines=3
  4. color 1f
  5. cls
  6. set time=
  7. echo.
  8. set /p time= 请输入在多少秒后关机:
  9. title 延时 %time% 秒关机
  10. echo.
  11. echo   电脑将在 %time% 秒后关机.
  12. shutdown -s -f -t %time% >nul
  13. ping -n 15 127.0.0.1>nul
复制代码


以上代码能不能在输入秒数字限制为数字?或者输入非数字时提示重输?


另外,有没有办法把SHUTDOWN的那个倒计时窗口隐藏掉?

[ 本帖最后由 semiuel 于 2008-12-8 00:59 编辑 ]

  1. @echo off
  2. :bgn
  3. set /p time=请输入在多少秒后关机:
  4. if "%time%" geq "0" if "%time%" lss "a" cls & goto next
  5. cls & echo 错误: 请输入数字!&echo.&echo.按任意键返回. . .
  6. pause>nul & cls & goto bgn
  7. :next
  8. title 延时 %time% 秒关机
  9. echo 电脑将在 %time% 秒后关机.
  10. pause
复制代码

TOP

也可以用findstr来判断
  1. @Echo Off
  2. :Loop
  3. If not defined var set "var=abcd"
  4. Echo %var%| Findstr "[^0-9]">nul && (Echo 只能是纯数字&set "var=1234" & goto :Loop)
  5. Pause
复制代码

但正确率有待提高,因为findstr的正则实在是不太强大~

[ 本帖最后由 pusofalse 于 2008-12-8 01:36 编辑 ]
心绪平和,眼藏静谧。

TOP

set /a time+1||goto loo[
3

评分人数

TOP

原帖由 everest79 于 2008-12-8 01:36 发表
set /a time+1||goto loo[

厉害,不过好像这样并不会出错。可以这样:
  1. @echo off
  2. set /p input=输入:
  3. set /a a=1/(%input%1) 2>nul && echo 数字 || echo 非数字
  4. pause
复制代码
1

评分人数

TOP

另外,有没有办法把SHUTDOWN的那个倒计时窗口隐藏掉?

可以考虑用at或者schtasks
for /f "delims=" %%a in ('%0') do (echo %%a)

TOP

//有没有办法把SHUTDOWN的那个倒计时窗口隐藏掉?
  1. @echo off
  2. title 延时关机
  3. mode con: cols=32 lines=3
  4. color 1f
  5. cls
  6. set time=
  7. echo.
  8. set /p time= 请输入在多少秒后关机:
  9. title 延时 %time% 秒关机
  10. echo.
  11. echo   电脑将在 %time% 秒后关机.
  12. set /a time+=1
  13. ping -n %time% 127.1 >nul
  14. shutdown -s -f -t 0
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

3 楼 正确率有待提高 是什么意思?findstr完全能解决这个问题吧?
也来一个
:
  1. @echo off
  2. :loop
  3. setlocal
  4. set /p var= &cls
  5. set num=a%var%
  6. for /l %%a in (0 1 9) do call set num=%%num:%%a=%%
  7. if "%num%"=="a" (echo %var% 是纯数字) else echo %var% 不是纯数字
  8. pause
  9. endlocal
  10. goto loop
复制代码

[ 本帖最后由 随风 于 2008-12-8 15:32 编辑 ]
技术问题请到论坛发帖求助!

TOP

谢谢楼上这么多好心的朋友帮助,白天没时间,只能晚上上来看了.

TOP

2楼代码只能判断输入的第一个字符,如果我输入"1a",它也当是数字的.
6楼,谢谢你的建议,但我一般都是把MSTASK服务关掉的.另一个你说的软件我没有.
7楼,ping -n 1 127.0.0.1只是约等于1秒,并不精确.
我按照5楼的方法写了下面的代码,没把SHUTDOWN窗口隐藏掉:
  1. @echo off
  2. title 延时关机
  3. mode con: cols=32 lines=3
  4. color 1f
  5. :begin
  6. cls
  7. set time=
  8. echo.
  9. set /p time= 请输入在多少秒后关机:
  10. set /a a=1/(%time%1) 2>nul && cls || goto begin
  11. title 延时 %time% 秒关机
  12. echo.
  13. echo   电脑将在 %time% 秒后关机.
  14. shutdown -s -f -t %time% >nul
  15. ping -n 15 127.0.0.1 >nul
复制代码

TOP

上面的代码还是有问题.
当我输入"10*20"后,SET /A判断通过了,但SHUTDOWN不认识这个"数字".

TOP

回复 10楼 的帖子

2楼的正则表达式有问题,应为:
  1. echo %input%|findstr "^[0-9]*$">nul&&echo 输入正确||echo 含有非法字符
复制代码
计划任务依赖的服务是Task Scheduler,跟MSTASK没关系吧?6楼说的两个命令都是XP系统自带的,哪个软件你没有?
正确的说法是:ping -n 2 127.0.0.1约等于1秒,而不是ping -n 1 127.0.0.1约等于1秒。
5楼并未提供隐藏shutdown窗口的方法,自然无法隐藏。
set /a会认为*是算数符号,因此产生误判,不推荐使用这个方法。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

判断数字的
  1. @echo off & setlocal
  2. if "%~1" neq "-new" start "" "%~f0" -new & exit/b
  3. set /p s=Please Input:
  4. call :IsNumeric "%s%" && echo True || echo False
  5. pause & exit
  6. :IsNumeric
  7. setlocal
  8. for /f "tokens=1* delims=:" %%a in ('findstr /n "^:IsNumeric$" "%~f0"') do set /a n=%%a+4
  9. (echo e11d '%~1' ff&more /e +%n% "%~f0")|debug>nul
  10. goto :eof
  11. a100
  12. MOV     BX,011D
  13. CMP     BYTE PTR [BX],30
  14. JB      0117
  15. CMP     BYTE PTR [BX],39
  16. JA      0117
  17. INC     BX
  18. CMP     BYTE PTR [BX],FF
  19. JNZ     0103
  20. MOV     AL,00
  21. JMP     0119
  22. MOV     AL,01
  23. MOV     AH,4C
  24. INT     21
  25. g
  26. q
  27. goto :eof
复制代码

TOP

把四F的改成这样?

set /a time+1||goto loop

改成:
  1. set /a 1/%time% 2>nul||goto loop
复制代码
是不是可以防止很大部分错误?

TOP

谢谢楼上几位包括管理员的解答,让我学到不少东西.

TOP

返回列表