2014-12-01 54 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,則該值是正確的。