命令行FINDSTR调用中特定RegEx的语法

时间:2012-12-18 15:10:45

标签: regex batch-file findstr

我正在编写一个批处理脚本,它在启动另一个进程之前会接收各种参数。在下面的例子中,我检查第一个参数为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。我相当肯定我很接近,但我在制定正确的语法时遇到了麻烦。

1 个答案:

答案 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
)