2012-03-23 88 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