2012-03-23 75 views
3

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

这段代码有什么问题?

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 
) 

enter image description here

+0

Btw。对于更简单的回显html代码,您可以使用[消失的引号技术](http://stackoverflow.com/a/7308647/463115)。就像'echo!“=!​​%% a​​Bu ...' – jeb 2012-03-23 08:32:12

+0

@jeb that does not work for me = O I still get the!”!的!在html文件中。 – Gynnad 2012-03-23 09:26:03

+0

好吧,我忘了提及,你需要使用'setlocal EnableDelayedExpansion'启用延迟扩展。 – jeb 2012-03-23 09:31:21

回答

10

经典批次问题 - 您正在设置您的ERRORLEVEL并试图在DO()子句中使用%ERRORLEVEL%来访问它。 %VAR%扩展发生在解析时间,并且整个FOR ... DO()语句被解析一次,所以您在语句执行之前看到ERRORLEVEL的值。显然这是行不通的。

jeb暗指他评论中有关消失报价的答案。如果您的setlocal enableDelayedExpansion在顶部,则问题将得到解决,然后使用!ERRORLEVEL!而不是%ERRORLEVEL%。另外,GregHNZ的正确之处在于,您的FINDSTR语句后应立即进行ERRORLEVEL测试。

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

下面的测试,如果ERRORLEVEL大于或等于1

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

及以下条件执行命令基于先前命令的结果

FindStr "SUCCESSFUL" test1.txt && (
    commands to execute if FindStr succeeded 
) || (
    commands to execute if prior command failed. 
) 
+0

这对我有用!谢谢! :) – Gynnad 2012-03-23 12:19:17

2

%ErrorLevel%变量仅适用于立即以前的命令。

所以,当你这样做:

echo Errorlevel: %ERRORLEVEL% 

以您目前的代码,你得到上述

CD命令的错误级别尝试FindStr命令后,把你的if %ERRORLEVEL% ==1立即行,然后之后做del和cd。很明显,你需要在你的echo语句中放入html文件的完整路径。

+0

我改变了代码,现在把它设置在第一篇文章中..但它仍然不起作用。我也在测试findStr语句后立即测试了一个Echo%ERRORLEVEL%。但他总是将0放出去。虽然命令行中的文本表示它部署失败.. – Gynnad 2012-03-23 08:42:13

+0

@GregHNZ:%ERRORLEVEL%没有提供CD命令的错误级别。它在FOR语句被解析之前给出值!但是你应该正确地认为错误级别测试应该在FINDSTR语句后立即发生。 – dbenham 2012-03-23 11:37:03