在基于 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)
这将检测第一个参数是否是有效的自然数(非负整数)。
@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。
归档时间: |
|
查看次数: |
46639 次 |
最近记录: |