我正在尝试使用Windows批处理文件来执行一个简单的操作,该操作要求用户输入一个非负整数.我正在使用简单的批处理文件技术来获取用户输入:
@ECHO OFF SET /P UserInput=Please Enter a Number:
用户可以在此处输入他们想要的任何文本,因此我想添加一些例程以确保用户输入的是有效数字.那就是......他们输入了至少一个字符,每个字符都是0到9之间的数字.我想要一些可以将UserInput输入的字符.例程结束时就像if/then那样根据它是否实际上是一个有效的数字来运行不同的语句.
我已经尝试过循环和子串等等,但我的知识和理解仍然很渺茫......所以任何帮助都会受到赞赏.
我可以构建一个可执行文件,我知道有更好的方法来处理批处理文件,但至少对于这个任务,我试图通过使用批处理文件来保持简单.
您可能不会在DOS批处理文件中执行此操作.或者至少,set /p
DOS中对我的支持是闻所未闻的:-)
你可以使用子串.事实上,我已经为特定的常规语言编写过一次解析器,但这很麻烦.最简单的方法可能是将内容分配%userinput%
给另一个变量,使用set /a
.如果结果出来,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"将导致脚本在用户输入被评估为math时崩溃/关闭.但在我的情况下,这很好.我不希望我的脚本继续无效输入.