如何在Windows批处理文件中检查参数(或变量)是否为数字

时间:2013-07-11 02:54:58

标签: batch-file

我需要检查传递给windows批处理文件的参数是否为数字。

我在下面的答案中找到了使用带有正则表达式的“findstr”命令: https://superuser.com/questions/404338/check-for-only-numerical-input-in-batch-file

我确实尝试过这个解决方案,但它没有用。 (至少在Windows 7中不起作用)。

测试场景:

AA  #NOT A VALID NUMBER
A1  #NOT A VALID NUMBER
1A  #NOT A VALID NUMBER

11  #A VALID NUMBER

10 个答案:

答案 0 :(得分:39)

SET "var="&for /f "delims=0123456789" %%i in ("%1") do set var=%%i
if defined var (echo %1 NOT numeric) else (echo %1 numeric)

根据需要将%1替换为%yourvarname%

答案 1 :(得分:12)

表示± integers测试也是前导零):

echo(%~1|findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$">nul&&echo numeric||echo not numeric

答案 2 :(得分:4)

你可以试试这个。传递的变量例如是var%var%等于500

set /a varCheck=%var%
if %varCheck% == %var% (goto :confirmed) else (exit /B)
exit /B

:confirmed
:: You can use %var% here, and it should only be executed if it is numerical!

如果%var%等于例如a3453d,然后将varCheck设置为0,并且因为0不等于a3453d,则它将退出批处理。

(第3行的退出是为了防止if语句由于某种原因决定不执行...... XD。)

答案 3 :(得分:3)

@hornzach - 你是如此亲密,答案比其他人简单得多。

隐藏错误消息(至少7赢)重定向到标准错误输出(2)到nul(一个特殊文件,悄然丢弃输出“bit-bucket”)

set /a varCheck = %var% 2>nul

然后你的其余答案适用于4个测试用例。

完整回答测试用例:

call :CheckNumeric AA  "#NOT A VALID NUMBER"
call :CheckNumeric A1  "#NOT A VALID NUMBER"
call :CheckNumeric 1A  "#NOT A VALID NUMBER"

call :CheckNumeric 11  "#A VALID NUMBER"

call :CheckNumeric 1.23456789012345678901234567890.123456  "#NOT A VALID NUMBER"
goto :EOF

:CheckNumeric
@ECHO.

@ECHO Test %1
set /a num=%1 2>nul

if {%num%}=={%1} (
    @ECHO %1 #A VALID NUMBER, Expected %2
    goto :EOF
)

:INVALID
    @ECHO %1 #NOT A VALID NUMBER, Expected %2

输出:

Test AA
AA #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"

Test A1
A1 #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"

Test 1A
1A #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"

Test 11
11 #A VALID NUMBER, Expected "#A VALID NUMBER"

Test 1.23456789012345678901234567890.123456
1.23456789012345678901234567890.123456 #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"

答案 4 :(得分:1)

与上述相同。有特殊字符的问题。但是,解决方案采用了不同的方法。

@echo off
cls
setlocal enabledelayedexpansion

if "%1"=="" (goto:eof) else (set _VAR2CHECK=%1)

for /l %%a in (0,1,9) do (
   if defined _VAR2CHECK (set "_VAR2CHECK=!_VAR2CHECK:%%a=!") else (goto :end)
)

:end
if defined _VAR2CHECK (echo %1 #NOT A VALID NUMBER) else (echo %1 #A VALID NUMBER)

set "_VAR2CHECK="
endlocal

测试场景:

C:\>ISNUM 1A
1A  #NOT A VALID NUMBER

C:\>ISNUM 11
11  #A VALID NUMBER

答案 5 :(得分:1)

最简单的正整数应该是:

IF %1 NEQ +%1 echo Notnumeric!

如果还要考虑负数(连字符),则可以使用

SET number=%1
if %1 EQU +%1 echo positive number
if %1==-%number:-=% echo negative number

https://www.itprotoday.com/compute-engines/jsi-tip-9692-how-can-batch-script-determine-if-variable-or-parameter-integer那里学习

答案 6 :(得分:0)

我改用此功能,它似乎对我来说没有任何问题...

脚本(mytestscript.bat)

REM == Script variables =============================================
SET "NUMCODE=%1"
SET "NAME=%2"

REM == Main script ==================================================
CALL :Validate "NUMCODE"
IF ERRORLEVEL 1 EXIT /B %ERRORLEVEL%
CALL :Validate "NAME"
IF ERRORLEVEL 1 EXIT /B %ERRORLEVEL%

ECHO Validation Complete and all variables passed validation.

REM == Functions ====================================================
:IsNumeric [string-value] [return-val]
    SET "stringVal=%~1"
    SET /A numericVal=%stringVal% > nul 2> nul
    IF "%stringVal%"=="%numericVal%" (SET "%~2=1") ELSE (SET "%~2=0")
    EXIT /B 0

:Validate
    SET PASSEDVALIDATION=0

    ECHO Validating %~1...

    IF "%~1"=="NUMCODE" (
        ECHO - Value: %NUMCODE%
        IF NOT "%NUMCODE%"=="" SET PASSEDVALIDATION=1
        IF "!PASSEDVALIDATION!"=="1" (
            CALL :IsNumeric %NUMCODE% RETVAL
            SET PASSEDVALIDATION=!RETVAL!
        )
        IF "!PASSEDVALIDATION!"=="1" (
            IF NOT %NUMCODE% GEQ 1 SET PASSEDVALIDATION=0
        )
        IF "!PASSEDVALIDATION!"=="1" (
            IF NOT %NUMCODE% LEQ 526 SET PASSEDVALIDATION=0
        )
        IF "!PASSEDVALIDATION!"=="0" (
            ECHO - The first parameter is invalid, it can not be blank.
            ECHO - Valid value is a number from 1 to 526.
            ECHO - Leading zeros are not valid.
        )
    )

    IF "%~1"=="NAME" (
        ECHO - Value: %NAME%
        IF NOT "%NAME%"=="" SET PASSEDVALIDATION=1
        IF "!PASSEDVALIDATION!"=="0" (
            ECHO - The second parameter is invalid, it can not be blank.
        )
    )

    IF "!PASSEDVALIDATION!"=="0" (
        ECHO - Failed validation.
        EXIT /B 1
    ) ELSE (
        ECHO - Passed validation.
    )
    EXIT /B 0

用法示例:

C:\mytestscript.bat 10 MrTest
Validating NUMCODE...
- Value: 10
- Passed validation.

Validating NAME...
- Value: MrTest
- Passed validation.

C:\mytestscript.bat 600
Validating NUMCODE...
- Value: 600
- The first parameter is invalid, it can not be blank.
- Valid value is a number from 1 to 526.
- Leading zeros are not valid.
- Failed validation.

C:\mytestscript.bat 10
Validating NUMCODE...
- Value: 10
- Passed validation.

Validating NAME...
- Value: 
- The second parameter is invalid, it can not be blank.
- Failed validation.

答案 7 :(得分:0)

只需尝试除以1。 但这不适用于Z以外的数字(非相对整数或十进制)。

set var=29
set /a number=%var% >nul 2>&1
set /a number=%number% / 1 >nul 2>&1
if "%var%" == "%number%" (echo numeric) else (echo NOT numeric)

答案 8 :(得分:0)

我使用技术含量较低的方法。它仅适用于整数并支持负值。

set "XVALUE=%~1"
set /A XVALUE=XVALUE
if "%XVALUE%" NEQ "%~1" goto :invalid_value

第一行获取命令行参数并将其放入XVALUE中。使用“引号”可以防止出现各种特殊字符的问题。

第二行看起来很神秘,但是当SET / A的等号右侧有一个文本字符串被解释为包含数字值的环境变量时,它利用了这一点。命令处理器在不生成任何错误消息或设置ERRORLEVEL的情况下解析假定的数值。这样做总是导致XVALUE转换为有效的数值,而不管传递给我们什么。

第三行是可选的,仅当您要严格要求参数是-2147483648到2147483647范围内的数字值时才需要。如果您不使用if测试,那么

  • 通过为八进制和十六进制数字加上0或0x前缀,可以支持它们。
  • 如果有人使用很小或很大的数字,例如-9999999999999或9999999999999,则XVALUE将设置为允许的最小值或最大值,即-2147483648和2147483647。
  • 如果有人使用诸如单词“ hello”之类的垃圾,那么XVALUE设置为0。如果它类似于123x456,则解析器在“ x”处停止,XVALUE设置为123。

答案 9 :(得分:0)

if errorlevel仅接受可用于检查的数值:

set test_var=001
( 
  (if errorlevel %test_var% break ) 2>nul
)&&(
  echo %test_var% is numeric
)||(
  echo %test_var% is NOT numeric
)

set test_var=001X
( 
  (if errorlevel %test_var% break ) 2>nul
)&&(
  echo %test_var% is numeric
)||(
  echo %test_var% is NOT numeric
)

第一张支票将通过,第二张不及格。 尽管以上脚本无法处理一元+-如果您也想处理这种情况,请检查-isInteger.bat