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

mhs*_*ams 17 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
Run Code Online (Sandbox Code Playgroud)

Mag*_*goo 42

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

更换%1%yourvarname%适当的

  • +1但用双引号括起"var = %% i"`可以防止一些毒药字符. (5认同)
  • +1,虽然我推荐`%~1`而不是'%1` (4认同)
  • 就我而言,不再在 Windows 10 中工作。如果我为 `%yourvarname%` 分配一个数值,则不会定义 `var`。有任何想法吗? (2认同)
  • 人们应该始终质疑自己的代码——我仍在学习永远不要相信自己的工作。+1 (2认同)
  • @MikeQ:批处理通常就是这样。将此视为模板。首先,“%1”是批处理过程的第一个参数,因此“call :chknumeric %varname%”会将“varname”的值替换为“%1”。在活动行前面加上标签“:chknumeric”并放置`goto :eof` 在下一行,您有一个返回 `var` 的过程。该例程针对数字字符串,并将处理例如条形码数字。如果愿意的话,可以将 `var` 更改为 `notnumeric` - 但可以根据“.”检查 `var`。测试单个小数点。或者针对不同的字符集&逻辑名称再次更改 (2认同)

End*_*oro 12

for ± integers(也测试前导零):

echo(%~1|findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$">nul&&echo numeric||echo not numeric
Run Code Online (Sandbox Code Playgroud)

  • @Endoro:此命令也可以正确处理有毒字符: `echo("%~1"|findstr "^[\"][-][1-9][0-9]*[\"]$ ^[\ "][1-9][0-9]*[\"]$ ^[\"]0[\"]$">nul&&回显数字||回显非数字` (2认同)

小智 8

你可以试试这个。例如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!
Run Code Online (Sandbox Code Playgroud)

如果%var%等于 eg a3453d,则设置varCheck0,因为0不等于a3453d,则退出批处理。

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


And*_*son 6

@hornzach - 你是如此接近,而且答案比其他人要简单得多。

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

set /a varCheck = %var% 2>nul
Run Code Online (Sandbox Code Playgroud)

然后您的其余答案适用于 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
Run Code Online (Sandbox Code Playgroud)

输出:

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"
Run Code Online (Sandbox Code Playgroud)

  • 此代码为所有具有 1 个或多个前导零(如 05 或 009)的数字产生错误结果,因为 Windows 命令处理器使用 C 函数 [strtol](http://www.cplusplus.com/) 将字符串转换为 32 位有符号整数参考/cstdlib/strtol/),函数参数为“base”,值为“0”(自动基数)。因此,我的两个示例的字符串比较是“{5}=={05}”(删除前导零)和“{}=={009}”。变量 num 仍然没有为 009 定义(或者在已经定义的情况下保持其当前值),因为 009 是一个无效的八进制数。 (2认同)

Ali*_*mir 5

最简单的正整数应该是:

IF 1%1 NEQ +1%1 echo Notnumeric!
Run Code Online (Sandbox Code Playgroud)

如果还要考虑负数(连字符),这将起作用

SET number=%1
if 1%1 EQU +1%1 echo positive number
if %1==-%number:-=% echo negative number
Run Code Online (Sandbox Code Playgroud)

这里的这篇文章中学到