检查批处理文件中是否只有数字输入

Can*_*uke 10 windows cmd.exe

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

Bob*_*Bob 19

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

解释

使用的参数设置到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
)
Run Code Online (Sandbox Code Playgroud)

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

注意:如果有前导零,这实际上会失败,导致命令处理器将其视为八进制数。请参阅dbenham 的答案以获得更好的解决方案。


小智 8

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

SET /a param=%1+0
IF NOT %param%==0 ECHO Valid number
Run Code Online (Sandbox Code Playgroud)

  • 如果参数 = 0,这将失败。还会将像“1+1”这样的参数视为数字,这可能会导致问题,具体取决于要求。 (4认同)

dbe*_*ham 8

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

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

如果你想在数字周围加上引号,那么

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

注意 - 不允许使用前导零,因为批处理将它们视为八进制,因此类似值09无效,010值为 8。