我需要检查传递给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
答案 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
答案 6 :(得分:0)
我改用此功能,它似乎对我来说没有任何问题...
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
测试,那么>
答案 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