2009-07-28 188 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声明,如前所述,并使用!!的括号内。