0

我正在编写一个批处理脚本,它在开始另一个进程之前接受各种参数。在下面的示例中,我正在检查第一个参数为 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 的明显 segway 导致我这样做(我尝试过使用和不使用“*”):

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。我相当肯定我很接近,但在制定正确的语法时遇到了麻烦。

4

1 回答 1

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
)
于 2012-12-18T15:49:56.277 回答