以下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 :(得分: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 语句,如前所述,并在括号内使用!!。