我正在编写一个批处理脚本,它在启动另一个进程之前会接收各种参数。在下面的例子中,我检查第一个参数为1的情况,第二个参数的形式为“任意数字0-9,后跟字母k,m或g”(我指的是进程应该从内存量开始,即10g = 10 Gb内存)。
如果我只想要一个数字就足够了:
IF [%1] EQU [1] ECHO %2|findstr /r "[^0-9]" > nul
IF [%1] EQU [1] IF errorlevel 1 echo starting test number %1 with %2 of memory
我认为添加字母k,m或g的显而易见的细分导致了我(我尝试过使用和不使用'*'):
IF [%1] EQU [1] ECHO %2|findstr /r "[^0-9]*[kmg]" > nul
IF [%1] EQU [1] IF errorlevel 1 echo starting test number %1 with %2 of memory
但是我无法将任何字符串与此FINDSTR模式匹配。基本上我正在寻找匹配[0-9] [0-9] * [kmg]的FINDSTR。我相当肯定我很接近,但我在制定正确的语法时遇到了麻烦。
答案 0 :(得分:2)
即使您发布的第一个代码也不起作用。 [^0-9]
查找任何非数字。我想你想要^[0-9]
,这意味着任何以数字开头的字符串。您的逻辑也是错误的:如果找到,FINDSTR将errorlevel设置为0,如果未找到则设置为1。我更喜欢使用条件&&
和||
运算符来测试结果,而不是IF。
我建议您尝试以下内容。我已经抛入/I
开关,使其不区分大小写。如果在带后缀的数字之前或之后有额外的字符,我会添加/X
开关以防止字符串匹配。
@echo off
if "%~1" equ "1" echo(%~2|findstr /rix "[0-9][0-9]*[kgm]" >nul && (
echo starting test number %~1 with %~2 of memory
)
不幸的是,FINDSTR不支持?
元字符。因此,如果后缀是可选的(如果要支持字节,千字节,兆字节和千兆字节),则解决方案稍微复杂一些。您需要搜索2个字符串中的任何一个,一个带后缀,一个不带。 FINDSTR将搜索字符串分成空格中的多个搜索字符串。
@echo off
if "%~1" equ "1" echo(%~2|findstr /rix "[0-9][0-9]*[kgm] [0-9][0-9]*" >nul && (
echo starting test number %~1 with %~2 of memory
)