在基于 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")