2009-07-28 228 views
0

內DOS環境變量下面的DOS腳本段有一個錯誤:正則表達式識別括號

if not exist %MyFolder% (
    mkdir %MyFolder% 
    if %errorlevel% GEQ 1 (
     rem WARNING: the line above has a bug! 
     rem %errorlevel% will be the errorlevel 
     rem of the if statement because of the (parentheses) 
     echo Error: Could not create folder %MyFolder% 
     goto AnErrorOccurred 
    ) 
) 

的解決辦法是使用setlocal enabledelayedexpansion如下:

setlocal enabledelayedexpansion 
if not exist %MyFolder% (
    mkdir %MyFolder% 
    if !errorlevel! GEQ 1 (
     rem WARNING: the line above has a bug! 
     rem !errorlevel! will be the errorlevel 
     rem of the if statement because of the (parentheses) 
     echo Error: Could not create folder %MyFolder% 
     endlocal & goto AnErrorOccurred 
    ) 
) 
endlocal 

的原因是可用的完整解釋這裏:Batch file fails to set environment variable within conditional statement

我想審計我的代碼來找到這個錯誤的實例,我認爲正則表達式是一個合適的匹配,但沒有設法得到一個工作...

我想的成分應該是: 匹配的環境變量,%percentsigns% 圍內。即(括號內)

有什麼建議?

+0

爲什麼要打擾這樣的事情?使用vbscript。它隨你的系統而來。 – ghostdog74 2009-07-28 01:43:06

+1

你的意思是括號? – 2009-07-28 01:53:55

+0

是的,JP,我的意思是括號,謝謝 – 2009-07-30 08:22:13

回答

1

grepWin

我會用grepWin。根據你必須要找到實例的數量,你可以寫一個正則表達式,它會給你所有的其中的一些,加上一些誤報。

例子:bug.bat

if not exist %MyVar% echo Hi! 

if not exist %MyFolder% (
    mkdir %MyFolder% 
    if %errorlevel% GEQ 1 (
     rem WARNING: the line above has a bug! 
     rem %errorlevel% will be the errorlevel 
     rem of the if statement because of the brackets 
     echo Error: Could not create folder %MyFolder% 
     goto AnErrorOccurred 
    ) 
) 

然後用正則表達式匹配,與if開始所有線路,並有一個開放的括號:

$ grep "^[ \t]*if.*(" bug.bat 
if not exist %MyFolder% (
    if %errorlevel% GEQ 1 (

grepWin會告訴你一切匹配的文件。

百分號

通過請求:

grep "^[ \t]*if.*%.*%.*(" bug.bat 
+0

+1因爲我喜歡這個答案,所以在接受之前我會堅持一會兒,以防萬一有人能做出一個能夠檢測出%percentignsigns%的人。 – 2009-07-30 08:37:11

+0

順便說一句,最後一個括號需要一個反斜槓來轉義它,而不是「^ [\ t] * if。*(」it needs「^ [\ t] * if。* \(」 – 2009-07-30 08:37:41

+0

當我逃避最後一個括號時,我看到以下錯誤:「grep:Unmatched(或\\(」)。grepWin可能需要轉義,不適用於Unix grep。 – 2009-07-30 09:05:38

0

你不能用正則表達式解決這個問題,因爲你不能指望用常規語言的括號。例如:

Stuff (
More Stuff (
Less Stuff) 
A %var% 
Less Stuff) 

還有就是最後)和變量之間沒有(。既然不能指望有多少`(出現之前知道是否有一個開放的,我不能用正則表達式做到這一點。

0

正如你所看到的,他是用!而即使是在根層次Rootlevel比%該批次。 所以基本上你應該能夠交替每%到!爲您的環境變量。

0

的另一種方式是使用AND(& &)和OR(||)成功(錯誤級別0)或錯誤檢測( errorlevel> 0),如:

if not exist %MyFolder% mkdir %MyFolder%|| (
     echo Error: Could not create folder %MyFolder% 
     goto AnErrorOccurred 
) 

我希望這可以提供幫助。

順便說一下,你就不能不設置變量,你無法閱讀回來。

發生什麼是,在括號內,使用%%的給你的狀態是你進入上述括號之前。我知道的唯一的工作是數學「set/a toto + = 1」這將正確地增加變量。否則,你有兩個選擇:

無論是使用一種稱爲函數來設置變量或使用SETLOCAL ENABLEDELAYEDEXPANSION聲明,如前所述,並使用!!的括號內。