Board logo

标题: [数值计算] SET /P有没有办法只允许输入数字? [打印本页]

作者: semiuel    时间: 2008-12-8 00:51     标题: 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 编辑 ]
作者: tireless    时间: 2008-12-8 01:18

  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
复制代码

作者: pusofalse    时间: 2008-12-8 01:35

也可以用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 编辑 ]
作者: everest79    时间: 2008-12-8 01:36

set /a time+1||goto loo[
作者: tireless    时间: 2008-12-8 02:16

原帖由 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
复制代码

作者: BBCC    时间: 2008-12-8 13:12

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

可以考虑用at或者schtasks
作者: Batcher    时间: 2008-12-8 13:26

//有没有办法把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
复制代码

作者: 随风    时间: 2008-12-8 15:27

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 编辑 ]
作者: semiuel    时间: 2008-12-8 20:21

谢谢楼上这么多好心的朋友帮助,白天没时间,只能晚上上来看了.
作者: semiuel    时间: 2008-12-8 20:48

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
复制代码

作者: semiuel    时间: 2008-12-8 21:54

上面的代码还是有问题.
当我输入"10*20"后,SET /A判断通过了,但SHUTDOWN不认识这个"数字".
作者: Batcher    时间: 2008-12-8 23:46     标题: 回复 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会认为*是算数符号,因此产生误判,不推荐使用这个方法。
作者: rat    时间: 2008-12-9 03:13

判断数字的
  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
复制代码

作者: youxi01    时间: 2008-12-9 08:14     标题: 把四F的改成这样?

set /a time+1||goto loop

改成:
  1. set /a 1/%time% 2>nul||goto loop
复制代码
是不是可以防止很大部分错误?
作者: semiuel    时间: 2008-12-9 22:13

谢谢楼上几位包括管理员的解答,让我学到不少东西.
作者: too_lazy    时间: 2008-12-10 21:55

ping -n %time% 127.1 >nul
為什么要用到這句???
可以解釋一下嗎???
謝謝
作者: semiuel    时间: 2008-12-10 23:09

原帖由 too_lazy 于 2008-12-10 21:55 发表
ping -n %time% 127.1 >nul
為什么要用到這句???
可以解釋一下嗎???
謝謝


楼上问的是几楼回复里的?
我自己代码里最后一句
ping -n 15 127.0.0.1
的目的是让窗口保持10秒左右后自动关闭.

7楼代码里的这一句目的是延时%time%次PING后执行SHUTDOWN(立即关机)
作者: too_lazy    时间: 2008-12-11 20:26

谢谢楼主!!!
以后会看清楚再问~~~!!!!!
作者: newxso    时间: 2008-12-13 00:16

原帖由 youxi01 于 2008-12-9 08:14 发表
set /a time+1||goto loop

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


此方法不能正确判断数字 0 ,因为 0 作为除数会出错。
作者: semiuel    时间: 2008-12-13 22:46

原帖由 rat 于 2008-12-9 03:13 发表
判断数字的@echo off & setlocal
if "%~1" neq "-new" start "" "%~f0" -new & exit/b
set /p s=Please Input:
call :IsNumeric "%s%" && echo True || echo False
pause & exit



:IsNumeric
setlocal
f ...


13楼的这个方法在判断数字失败一次后进入实模式DOS,也就是说不认中文字了.




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