3

我做了一段批处理代码,我认为这会起作用。我在想这段代码在做什么?我有一些插件,我想测试部署是否正确。所以我从 plugins.txt 中得到了 pluginlink。然后我用 java 语句从 SVN 获取插件。我部署插件并在 test1.txt 中获得反馈。然后我在该文件中执行 findStr 并搜索“BUILD SUCCESSFUL”,如果它在那里我想添加句子 Build Gelukt,如果它失败我想添加 Build Fout。但我总是得到 Build Gelukt 的答案,而正如您在图像中看到的那样,他发回的构建失败。

这段代码有什么问题?

for /f "tokens=* delims= " %%a in (plugins.txt) do (
echo %%a
cd "C:\dotCMS Automatic Install"
java -cp .;"C:\dotCMS Automatic Install\svnkit.jar" Test %%a
cd %dotcms_home%
call ant deploy-plugins > test1.txt
FindStr "SUCCESSFUL" test1.txt
if %ERRORLEVEL% ==1 (echo ^<tr BGCOLOR=\"#FFFFFF\"^>^<td^>%%a^</td^>^<td^>Build Fout^</td^>^</tr^> >> C:\dotCMSResults\goedje.html ) else (echo ^<tr BGCOLOR=\"#00FF00\"^>^<td^>%%a^</td^>^<td^>Build Gelukt^</td^>^</tr^> >> C:\dotCMSResults\goedje.html) 
del test1.txt
rem call ant undeploy-plugins >> test.txt
)

在此处输入图像描述

4

2 回答 2

14

经典批处理问题 - 您正在设置 ERRORLEVEL 并尝试%ERRORLEVEL%在同一DO()子句中访问它。%VAR%扩展发生在解析时,整个FOR ... DO()语句被解析一次,因此您在执行语句之前看到 ERRORLEVEL 的值。显然那是行不通的。

jeb 在他关于消失引用的评论中提到了答案。如果您setlocal enableDelayedExpansion在顶部,您的问题将得到解决,然后使用!ERRORLEVEL!而不是%ERRORLEVEL%. 此外,GregHNZ 是正确的,因为 ERRORLEVEL 测试应该在您的 FINDSTR 语句之后立即发生。

还有其他方法可以在不需要延迟扩展的括号内处理 ERRORLEVEL:

以下测试 ERRORLEVEL 是否大于或等于 1

IF ERRORLEVEL 1 (...) ELSE (...)

下面根据先前命令的结果有条件地执行命令

FindStr "SUCCESSFUL" test1.txt && (
  commands to execute if FindStr succeeded
) || (
  commands to execute if prior command failed.
)
于 2012-03-23T11:32:30.787 回答
2

%ErrorLevel%变量仅适用于前一个命令。

所以当你这样做时:

echo Errorlevel: %ERRORLEVEL%

使用您当前的代码,您将获得上述CD命令的错误级别

尝试将您的if %ERRORLEVEL% ==1 行立即放在FindStr命令之后,然后执行 del 和 cd 。显然,您需要将 html 文件的完整路径放在 echo 语句中。

于 2012-03-23T08:27:48.703 回答