检查批处理文件中仅输入数字

检查批处理文件中仅输入数字

在基于 Windows NT 的命令行中(主要是 XP 或更高版本),有没有办法验证所提供的开关是否只是数字?根据数字,我希望它循环遍历代码X次数

答案1

编辑以修复正则表达式debham 的评论。事实证明,在 echo 之后的管道前添加空格会为管道字符串添加一个空格,这就是之前破坏行首/行末匹配的原因。可以通过丢弃开头和结尾的空格来进一步改进正则表达式。


这是findstr命令。它可以使用正则表达式搜索文件,就像grep在 Linux 中一样。它还可以搜索管道输入。

@echo off

set param=%1

echo %param%| findstr /r "^[1-9][0-9]*$">nul

if %errorlevel% equ 0 (
    echo Valid number
)

解释

使用的参数被设置到param变量中。但是,没有什么可以阻止您直接使用该参数(%1对于第一个参数)。

findstr用于通过/r正则表达式标志来搜索管道输入。

模式:

  • ^表示行首。

  • [0-9]表示一位数字。*表示前一位数字重复零次或多次。所以[0-9][0-9]*表示一位数字加上零位或多位数字。换句话说,至少一位数字。+似乎不支持一次或多次findstr。请注意,[1-9]用于第一位数字以禁止前导零 - 请参阅注释。

  • $表示行尾。


现在,批处理中的 for 循环X次数...如果X不是有效数字,循环实际上根本不运行 - 只是跳过下一行。因此无需检查输入是否为有效数字!

@echo off

set param=%1

for /l %%a in (1,1,%param%) do (
    echo %%a
)

循环使用 完成for /l,其中(x,y,z)表示从 开始x,以 递增y直到z。并且它设置%%a为当前数字/迭代。

注意:如果前导零,则此操作实际上会失败,导致命令处理器将其视为八进制数。请参阅dbenham 的回答以寻求更好的解决方案。

答案2

以下对我来说非常有效。如果为空或非数字,则SET /a param=%1+0始终返回。否则,它会提供给定的数字。0%1

SET /a param=%1+0
IF NOT %param%==0 ECHO Valid number

答案3

这将检测第一个参数是否是有效的自然数(非负整数)。

@echo off
echo %1|findstr /xr "[1-9][0-9]* 0" >nul && (
  echo %1 is a valid number
) || (
  echo %1 is NOT a valid number
)

如果你想允许数字周围有引号,那么

@echo off
echo "%~1"|findstr /xr /c:\"[1-9][0-9]*\" /c:\"0\" >nul && (
  echo %~1 is a valid number
) || (
  echo %~1 is NOT a valid number
)

注意 - 不允许使用前导零,因为批处理将它们视为八进制,因此像这样的值09无效,并且010其值为 8。

答案4

你可以验证任何变量是否符合以下条件:

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

相关内容