正则表达式来识别大括号内的DOS环境变量

时间:2009-07-28 01:39:45

标签: regex batch-file

以下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%的环境变量 那是在(括号)

里面

有什么建议吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您无法使用Regex解决此问题,因为您无法使用常规语言计算括号。例如:

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

最后(和变量之间没有)。因为我无法计算多少`(以前知道是否有一个打开,我不能用正则表达式来做。

答案 2 :(得分:0)

正如你所看到的,他正在使用!而不是%甚至在批次的根级别。 所以基本上你应该能够将每个%交替到一个!为你的环境变量。

答案 3 :(得分:0)

另一种方法是使用AND(&amp;&amp;)和OR(||)测试成功(错误级别0)或错误(错误级别&gt; 0),如:

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

我希望这可以提供帮助。

顺便说一句,你不能 设置 变量,你无法 读取 它回来。

在括号内,使用%%的内容会给出您在输入所述括号之前的状态。我唯一知道运作良好的是数学“set / a toto + = 1”,这将正确地增加变量。否则你有两个选择:

使用被调用函数来设置变量或使用 setlocal ENABLEDELAYEDEXPANSION 语句,如前所述,并在括号内使用!!。