批量文件inputvalidation – 确保用户input一个整数

我正在试验一个Windowsbatch file来执行一个简单的操作,要求用户input一个非负整数。 我正在使用简单的batch file技术来获取用户input:

@ECHO OFF SET /P UserInput=Please Enter a Number: 

用户可以在这里input他们想要的任何文本,所以我想添加一些例程来确保用户input的是一个有效的数字。 那是…他们至lessinput了一个字符,每个字符都是从0到9的数字。我想要一些可以将UserInputinput的字符。 例程的结尾就像一个if / then那样会根据它是否是一个有效的数字来运行不同的语句。

我已经尝试过循环和子string等,但我的知识和理解仍然是苗条的…所以任何帮助将不胜感激。

我可以构build一个可执行文件,我知道有比batch file更好的方法,但至less对于这个任务,我试图通过使用batch file保持简单。

你可能没有在DOS批处理文件中这样做。 或者至少,在DOS下对于set /p支持是闻所未闻的:-)

你可以使用子字符串。 实际上,我曾经用一种特定的正则语言编写了一个解析器,但这很麻烦。 最简单的方法可能是使用set /a%userinput%的内容分配给另一个变量。 如果结果为0 ,则需要检查输入本身是否为0 ,否则可以断定它是非数字:

 @echo off setlocal enableextensions enabledelayedexpansion set /p UserInput=Enter a number: set /a Test=UserInput if !Test! EQU 0 ( if !UserInput! EQU 0 ( echo Number ) else ( echo Not a number ) ) else ( echo Number ) 

但是,这只适用于Int32范围内的数字。 如果你只关心任何数字(也可能是浮点数),那么你需要使用基于循环的解剖方法。

注:更新以解决空间问题。 但是,仍然存在潜在的问题:输入123/5产生“数字”,因为set /a可以评估这个…

这和Johannes的想法是一样的。SET / A设置一个数值。 如果输入不是数字,它会将其更改为0.这就是您可以在这里利用您的检查。

 @ECHO OFF SET /P UserInput=Please Enter a Number: IF %UserInput% EQU 0 GOTO E_INVALIDINPUT SET /A UserInputVal="%UserInput%"*1 IF %UserInputVal% GTR 0 ECHO UserInput "%UserInputVal%" is a number IF %UserInputVal% EQU 0 ECHO UserInput "%UserInputVal%" is not a number GOTO EOF :E_INVALIDINPUT ECHO Invalid user input :EOF 

作为一种替代方法,你总是可以创建一个小的JavaScript文件,并从你的批处理文件中调用它。 使用parseInt()你可以强制输入是一个整数,或者你可以滚动自己的函数来测试输入。

编写JavaScript与批处理文件一样快,但功能更强大。 不需要IDE或编译器; 记事本会做的。 运行在每个窗口框,就像你的批处理文件一样。 那为什么不使用它呢?

你甚至可以混合批处理文件和JavaScript。 例:

sleep.js的内容:

 var SleepSecs=WScript.Arguments.Item(0); WScript.Sleep(SleepSecs*1000) 

sleep.cmd的内容:

 cscript /nologo sleep.js %1 

你现在可以从批处理文件中调用这个脚本来让你的脚本睡眠10秒钟。 像这样的东西很难做到,只是一个简单的批处理文件。

 sleep 10 

谢谢大家。 我试图让自己更难以看到循环和字符串操作。 我用你的提示数学评估和比较。 以下是我最终想到的概念脚本:

 :Top @ECHO OFF ECHO. ECHO --------------------------------------- SET /P UserInput=Please Enter a Number: ECHO. ECHO UserInput = %UserInput% ECHO. SET /A Evaluated=UserInput ECHO Math-Evaluated UserInput = %Evaluated% if %Evaluated% EQU %UserInput% ( ECHO Integer IF %UserInput% GTR 0 ( ECHO Positive ) IF %UserInput% LSS 0 ( ECHO Negative ) IF %UserInput% EQU 0 ( ECHO Zero ) REM - Other Comparison operators for numbers REM - LEQ - Less Than or Equal To REM - GEQ - Greater Than or Equal To REM - NEQ - Not Equal To ) ELSE ( REM - Non-numbers and decimal numbers get kicked out here ECHO Non-Integer ) GOTO Top 

这种方法捕获所有数字,并可以检测是否为正数,负数或零。 任何小数或字符串将被检测为非整数。 我发现唯一的边缘情况是一个带空格的字符串。 例如,当用户输入被评估为数学时,文本“Number 1”将导致脚本崩溃/关闭。 但在我的情况下,这很好。 我不希望我的脚本继续无效的输入。

你也可以使用一个相当简单的技巧:

 echo %userinput%|findstr /r /c:"^[0-9][0-9]*$" >nul if errorlevel 1 (echo not a number) else (echo number) 

这使用findstr的正则表达式匹配功能。 他们不是很令人印象深刻,但有时有用。

正如ghostdog74指出,由乔伊2009年3月26日(评分10)和Wouter van Nifterick发表的回答(5分)不起作用。

除了重定向符号和'&'导致语法错误之外,Joey Mar 10 '25(score 2)发布的答案确实有效。

我认为最好和最简单的解决方案是2014年10月8日发布的(0分)。 不幸的是,它有一个错字:''%a''应该是''%a%'''。

这是一个基于Sager的答案的批处理文件。 输入中的重定向符号和“&”不会导致问题。 我能找到的唯一问题是由包含双引号的字符串引起的。

 @echo off & setlocal enableextensions & echo. set /p input=Enter a string: SET "x=" & for /f "delims=0123456789" %%i in ("%input%") do set x=%%i if defined x (echo Non-numeral: "%x:~0,1%") else (echo No non-numerals) 

除了关于当空间是用户输入的一部分时发生的错误的评论。 您可以使用errorlevel errorlevel = 9165。 它可以用于字符串中的空格或用于“否”输入的错误处理。

亲切的问候,

埃格伯特

你也可能喜欢这个 – 它简短而简单。 这个使用乘法技巧来设置TestVal。 将TestVal与UserInput进行比较可以使所有的数值通过包括零,只有非数字才会触发else语句。 您也可以设置ErrorLevel或其他变量来指示失败的条目

 @ECHO OFF SET TestVal=0 SET /P UserInput=Please Enter a Number: SET /A TestVal="%UserInput%"*1 If %TestVal%==%UserInput% ( ECHO You entered the number %TestVal% ) else ECHO UserInput "%UserInput%" is not a number GOTO EOF :EOF 

我知道这已经有几年了,但只是为了分享我的解决方案。

 set /p inp=Int Only : :: Check for multiple zeros eg : 00000 :: set ch2=%inp%-0 if %inp% EQU 0 goto :pass if [%inp%]==[] echo Missing value && goto :eof if %inp:~0,1%==- echo No negative integers! && goto :eof set /a chk=%inp%-10>nul if %chk%==-10 echo Integers only! && goto :eof :pass echo You shall pass :eof 

测试并在Windows 8上工作。

 :ASK SET /P number= Choose a number [1 or 2]: IF %number% EQU 1 GOTO ONE IF %number% NEQ 1 ( IF %number% EQU 2 GOTO TWO IF %number% NEQ 2 ( CLS ECHO You need to choose a NUMBER: 1 OR 2. ECHO. GOTO ASK ) ) 

对我来说工作得很好。 如果他选择少于或者多于数字,字符串,浮动数字等,他会收到一条消息(“你需要选择一个数字:1或2”),然后再次输入INPUT。

你可以重新发明轮子,并成批地进行字符串验证的一些白发,或者你可以使用VBScript

 strInput = WScript.Arguments.Item(0) If IsNumeric(strInput) Then WScript.Echo "1" Else WScript.Echo "0" End If 

将其保存为checkdigit.vbs并保存在批处理中

 @echo off for /F %%A in ('cscript //nologo checkdigit.vbs 100') do ( echo %%A rem use if to check whether its 1 or 0 and carry on from here ) 

@echo off setlocal enableextensions enabledelayedexpansion set / p UserInput =输入一个数字:set / a Test = UserInput if!Test! EQU 0(if!UserInput!EQU 0(echo Number)else(echo not a number))else(echo Number)

yeaph everthing是伟大的,但你忘了一件小事0也是一个数字;(

这更多的是一个用户友好的方式。

 if %userinput%==0 ( cls goto (put place here) ) if %userinput%==1 ( cls goto (put place here) ) if %userinput%==2 ( cls goto (put place here) ) if %userinput%==3 ( cls goto (put place here) ) if %userinput%==4 ( cls goto (put place here) ) if %userinput%==5 ( cls goto (put place here) )if %userinput%==6 ( cls goto (put place here) )if %userinput%==7 ( cls goto (put place here) ) if %userinput%==8 ( cls goto (put place here) ) if %userinput%==9 ( cls goto (put place here) ) 

这可以用于任何类型的用户输入。

你可以验证任何变量,如果它的编号:

 SET "var="&for /f "delims=0123456789" %i in ("%a") do set var=%i if defined var (echo."NIC">nul) else (echo."number") 

您可以使用ReadFormattedLine子例程来处理所有类型的输入。 例如,下面的命令可以读取最多5位的数字:

 call :ReadFormattedLine UserInput="#####" /M "Please Enter a Number: " 

这个子程序是用纯批量编写的,所以它不需要任何额外的程序,它允许进行多种格式化的输入操作,比如读取密码。 在前面的例子中,子程序读取最多5位的数字。 你可以从Read行中下载ReadFormattedLine子程序。