2014-12-01 55 views
0

我有一个批处理文件,要求输入,将该输入存储在一个var中,然后在一个ping中使用该var。我需要确保匹配输入几个命名约定FINDSTR和正则表达式问题

命名约定之一:
PCX1可以高达100
GENPRT1可以高达100
NETPRT1可以高达100
如果我输入12,它不会工作FAXPRT1可以高达100

所以,但如果我进入PCX12会的。

除了正则表达式,脚本中的所有东西都起作用。我如何得到这个工作?

if "%sta%" == "findstr %sta% ^PCX[0-9]*[0-9]*[0-9]$ \i" (
    echo The syntax is correct 
    goto PING 
) else (
    set errmsg=The syntax is wrong 
    goto START 
) 
+0

坏习惯恕我直言 - 不要使用保留字指针,文件,头等,这使得它非常难以排除故障/修复脚本!我会使用而不是goto PING并转到START,转到PINGER并转到STARTER。PING和START是带BATCH脚本的保留字。 – Leptonator 2014-12-01 18:08:46

回答

0

这应有助于:

^(PCX|GENPRT|NETPRT|FAXPRT)([\d]|0[\d]|00[\d]|0[\d][\d]|[\d][\d]|100)$

+0

'不应该'([1-9] | [1-9] [0-9] | 100)'对于OP的问题更具体吗? – 2014-12-01 17:47:28

+0

我已经编写了允许任何格式的最多三位数字(1,01,001)的模式,同时仍然将值限制为1-100。诚然,这不是OP要求的一部分,但它可能会有所帮助。 – 2014-12-01 18:31:14

0

FINDSTR的正则表达式的味道极其有限。它甚至不支持交替(|),所以即使非常简单的问题也会有非常混乱的解决方案。这里是最紧凑的表情我能想出:

FINDSTR /R /I "^PCX[1-9][0-9]?$ ^PCX100$ ^GENPRT[1-9][0-9]?$ ^GENPRT100$ ^NETPRT[1-9][0-9]?$ ^NETPRT100$ ^FAXPRT[1-9][0-9]?$ ^FAXPRT100$" 

每个空格分隔的序列视为一个单独的正则表达式,所以这种尝试在每次测试串执行多达八场比赛。这并不是说它很慢,但是当你习惯了真正的正则表达式时,使用这个屁股会很痛苦。

以供参考,这是我会怎么写了,在浆液性正则表达式的味道:

^(PCX|((GEN|NET|FAX)PRT))([1-9][0-9]?|100)$ 

如果您在使用不同的工具(的选项像PowerShell中,它使用.NET的功能非常强大和功能 - 丰富的正则表达风味),我强烈建议你这样做。

0
@echo off 
    setlocal disabledelayedexpansion 

:start 
    set /p "sta=What ? " 

    cmd /v /d /q /c "(echo(!sta!)"^
    | findstr /i /r /b /e "PCX[0-9]* GENPRT[0-9]* NETPRT[0-9]* FAXPRT[0-9]*"^
    | findstr /r /e "[^0-9][1-9] [^0-9][1-9][0-9] [^0-9]100" > nul 

    if errorlevel 1 (
     echo The syntax is wrong 
     goto :start 
    ) 

    echo The syntax is correct 

甲新cmd实例用于保证所测试的串将不包括在最后任何解析器额外的空间。对echo命令的输出进行测试,以查看它是否匹配任何起始字符串,然后是数字,直到结尾。然后再次测试一个有效的数字范围。

如果设置了errorlevel,则该值与条件不匹配,并且请求新值。

如果未设置errorlevel,则该值是正确的。