标题: [数值计算] SET /P有没有办法只允许输入数字? [打印本页]
作者: semiuel 时间: 2008-12-8 00:51 标题: SET /P有没有办法只允许输入数字?
- @echo off
- title 延时关机
- mode con: cols=32 lines=3
- color 1f
- cls
- set time=
- echo.
- set /p time= 请输入在多少秒后关机:
- title 延时 %time% 秒关机
- echo.
- echo 电脑将在 %time% 秒后关机.
- shutdown -s -f -t %time% >nul
- ping -n 15 127.0.0.1>nul
复制代码
以上代码能不能在输入秒数字限制为数字?或者输入非数字时提示重输?
另外,有没有办法把SHUTDOWN的那个倒计时窗口隐藏掉?
[ 本帖最后由 semiuel 于 2008-12-8 00:59 编辑 ]
作者: tireless 时间: 2008-12-8 01:18
- @echo off
- :bgn
- set /p time=请输入在多少秒后关机:
- if "%time%" geq "0" if "%time%" lss "a" cls & goto next
- cls & echo 错误: 请输入数字!&echo.&echo.按任意键返回. . .
- pause>nul & cls & goto bgn
-
- :next
- title 延时 %time% 秒关机
- echo 电脑将在 %time% 秒后关机.
- pause
复制代码
作者: pusofalse 时间: 2008-12-8 01:35
也可以用findstr来判断- @Echo Off
- :Loop
- If not defined var set "var=abcd"
- Echo %var%| Findstr "[^0-9]">nul && (Echo 只能是纯数字&set "var=1234" & goto :Loop)
- 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[
厉害,不过好像这样并不会出错。可以这样:- @echo off
- set /p input=输入:
- set /a a=1/(%input%1) 2>nul && echo 数字 || echo 非数字
- pause
复制代码
作者: BBCC 时间: 2008-12-8 13:12
另外,有没有办法把SHUTDOWN的那个倒计时窗口隐藏掉?
可以考虑用at或者schtasks
作者: Batcher 时间: 2008-12-8 13:26
//有没有办法把SHUTDOWN的那个倒计时窗口隐藏掉?- @echo off
- title 延时关机
- mode con: cols=32 lines=3
- color 1f
- cls
- set time=
- echo.
- set /p time= 请输入在多少秒后关机:
- title 延时 %time% 秒关机
- echo.
- echo 电脑将在 %time% 秒后关机.
- set /a time+=1
- ping -n %time% 127.1 >nul
- shutdown -s -f -t 0
复制代码
作者: 随风 时间: 2008-12-8 15:27
3 楼 正确率有待提高 是什么意思?findstr完全能解决这个问题吧?
也来一个
:- @echo off
- :loop
- setlocal
- set /p var= &cls
- set num=a%var%
- for /l %%a in (0 1 9) do call set num=%%num:%%a=%%
- if "%num%"=="a" (echo %var% 是纯数字) else echo %var% 不是纯数字
- pause
- endlocal
- 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窗口隐藏掉:- @echo off
- title 延时关机
- mode con: cols=32 lines=3
- color 1f
- :begin
- cls
- set time=
- echo.
- set /p time= 请输入在多少秒后关机:
- set /a a=1/(%time%1) 2>nul && cls || goto begin
- title 延时 %time% 秒关机
- echo.
- echo 电脑将在 %time% 秒后关机.
- shutdown -s -f -t %time% >nul
- 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楼的正则表达式有问题,应为:- 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
判断数字的- @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
- for /f "tokens=1* delims=:" %%a in ('findstr /n "^:IsNumeric$" "%~f0"') do set /a n=%%a+4
- (echo e11d '%~1' ff&more /e +%n% "%~f0")|debug>nul
- goto :eof
- a100
- MOV BX,011D
- CMP BYTE PTR [BX],30
- JB 0117
- CMP BYTE PTR [BX],39
- JA 0117
- INC BX
- CMP BYTE PTR [BX],FF
- JNZ 0103
- MOV AL,00
- JMP 0119
- MOV AL,01
- MOV AH,4C
- INT 21
-
- g
- q
- goto :eof
复制代码
作者: youxi01 时间: 2008-12-9 08:14 标题: 把四F的改成这样?
set /a time+1||goto loop
改成:- 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 |