2008-09-24 19 views
6

我試圖通過.cmd文件自動化我用測試套件製作的程序。.cmd和.bat文件將返回代碼轉換爲錯誤消息

我可以通過%errorlevel%得到我運行返回代碼的程序。

我的程序對每種類型的錯誤都有一定的返回碼。

例如:

1 - 手段失敗某某原因

2 - 手段失敗某些其他原因

...

回聲FAILED:測試失敗的情況下,錯誤等級:%errorlevel%>> TestSuite1Log.txt

相反,我想以某種方式說:

echo FAILED:測試用例失敗,錯誤原因:lookupError(%errorlevel%)>> TestSuite1Log.txt

這是可能的.bat文件嗎?或者我必須移動到像Python/Perl這樣的腳本語言?

回答

13

你可以用ENABLEDELAYEDEXPANSION選項很整齊地做到這一點。這允許您使用!作爲在%之後評估的變量標記。

REM Turn on Delayed Expansion 
SETLOCAL ENABLEDELAYEDEXPANSION 

REM Define messages as variables with the ERRORLEVEL on the end of the name 
SET MESSAGE0=Everything is fine 
SET MESSAGE1=Failed for such and such a reason 
SET MESSAGE2=Failed for some other reason 

REM Set ERRORLEVEL - or run command here 
SET ERRORLEVEL=2 

REM Print the message corresponding to the ERRORLEVEL 
ECHO !MESSAGE%ERRORLEVEL%! 

類型HELP SETLOCALHELP SET在命令提示關於延遲擴展的更多信息。

+0

我喜歡這種簡單性,我的回覆讓我回想起更早的DOS日子。 ENABLEDELAYEDEXPANSION選項何時添加? – 2008-09-24 22:32:31

1

不完全如此,有一個子程序,但是您可以使用goto解決方法使用文本填充變量。

如果你的這個測試套件增長很多,使用更強大的語言可能會更容易。 Perl甚至Windows腳本主機可以幫助你。

1

是的,你可以使用呼叫。只是在一個新的線路上打電話,並通過錯誤代碼。這應該工作,但我沒有測試過。

C:\Users\matt.MATTLANT>help call 
Calls one batch program from another. 

CALL [drive:][path]filename [batch-parameters] 

    batch-parameters Specifies any command-line information required by the 
        batch program. 

SEDIT:奧利我可能誤會了一點,但你可以以相反的順序使用IF也

1

測試你的價值觀和使用的IF超載行爲:

@echo off 
myApp.exe 
if errorlevel 2 goto Do2 
if errorlevel 1 goto do1 
echo Success 
goto End 

:Do2 
echo Something when 2 returned 
goto End 

:Do1 
echo Something when 1 returned 
goto End 

:End 

如果你想變得更強大,你可以嘗試這樣的事情(你需要用%errorlevel替換%1,但是對我來說很難測試)。您需要把一個標籤,你對待每一個錯誤級別:

@echo off 
echo passed %1 
goto Label%1 

:Label 
echo not matched! 
goto end 

:Label1 
echo One 
goto end 

:Label2 
echo Two 
goto end 

:end 

下面是測試:

C:\>test 
passed 
not matched! 

C:\>test 9 
passed 9 
The system cannot find the batch label specified - Label9 

C:\>test 1 
passed 1 
One 

C:\>test 2 
passed 2 
Two 
0

您可以使用「IF ERRORLEVEL」語句來完成基於不同的東西返回代碼。

請參見:

http://www.robvanderwoude.com/errorlevel.html

在回答你的第二個問題,我會轉移到使用腳本語言,無論如何,由於Windows批處理文件天生就如此限制。有很多用於Perl,Python,Ruby等的Windows發行版,所以沒有理由不使用它們。我個人喜歡在Windows上做Perl腳本。

2

你可以做類似下面的代碼。請注意,由於cmd怪癖,錯誤級別比較應該按降序排列。

setlocal 

rem Main script 
call :LookupErrorReason %errorlevel% 
echo FAILED Test case failed, error reason: %errorreason% >> TestSuite1Log.txt 
goto :EndOfScript 

rem Lookup subroutine 
:LookupErrorReason 
    if %%1 == 3 set errorreason=Some reason 
    if %%1 == 2 set errorreason=Another reason 
    if %%1 == 1 set errorreason=Third reason 
goto :EndOfScript 

:EndOfScript 
endlocal 
相關問題