2008-09-24 19 views
6

Bir .cmd dosyası aracılığıyla bir test paketiyle yaptığım bir programı otomatikleştirmeye çalışıyorum..cmd ve .bat dosya dönüş kodunu bir hata iletisine dönüştürüyor

Geri dönüş kodunun çalıştırdığı programı% errorlevel% aracılığıyla alabilirim.

Programımın her hata türü için belirli dönüş kodları vardır.

Örneğin

:

1 - vasıta filanca bir nedenden

2 için başarısız oldu - vasıta başka bir nedenle

için başarısız ...

BAŞARISIZ echo: Test durumda başarısız Hata seviyesi:% errorlevel% >> TestSuite1Log.txt

Bunun yerine bir şekilde söylemek istiyorum:

.210

BAŞARISIZ echo: Test durumda, hata nedeni başarısız oldu: lookupError (% errorlevel%) >> TestSuite1Log.txt

bu bir .bat dosyası ile mümkün mü? Ya da python/perl gibi bir betik diline geçmek zorunda mıyım?

cevap

13

Bunu çok düzgün bir şekilde ENABLEDELAYEDEXPANSION seçeneği ile yapabilirsiniz. Bu, %'dan sonra değerlendirilen ! değişken işaretçisi olarak kullanılmasını sağlar. gecikmiş genişleme konusunda daha fazla bilgi için komut istemine

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%! 

Tip HELP SETLOCAL ve HELP SET.

+0

Bunun basitliğinden hoşlanıyorum, cevabım, DOS günlerinde daha uzun süre öncesine dayanıyor. ENABLEDELAYEDEXPANSION seçeneği ne zaman eklendi? –

+0

Oh, dikkat edilecek bir şey, yukarıda gösterilen "setlocal" komutu, ERRORLEVEL'in üzerine yazacaktır. Hata kümesini ayarlayan komuttan önce setlocal'ın çağrıldığından emin olun (yığın dosyası üzerinde bunun üstesinden gelir). –

+0

Maalesef eklendiğinde hiçbir fikrim yok. Bu platformlarda çalışan komut dosyaları yazdığım gibi XP ve 2003 Server'da mevcut olduğunu biliyorum. Windows'un hangi önceki sürümlerinde çalıştığından emin değil. –

1

Tam olarak bunun gibi bir alt yordam ile değil, bir değişkeni goto geçici çözümünü kullanarak metinle doldurabilirsiniz.

Bu test grubunuz daha güçlü bir dil kullanmak için biraz büyüdüğünde daha kolay olabilir. Perl veya hatta Windows Scripting Host size orada yardımcı olabilir.

1

Evet, çağrıyı kullanabilirsiniz. Sadece yeni bir hat üzerinde arama yapınız ve hata kodunu paslayınız. Bu çalışmalı, ama test etmedim.

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: Endişe i biraz yanlış anlamış olabilir, ancak ters sırada Testi ayrıca IF

1

değerlerinizi kullanmak ve IF arasında aşırı davranışları kullanabilirsiniz:

@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 

Daha güçlü olmak istiyorsanız, bunun gibi bir şey deneyebilirsiniz (% 1'i% errorlevel ile değiştirmeniz gerekir, ancak benim için sınamak daha zordur). Sen başa her hata seviyesi için bir etiket koymak gerekir: Burada

@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 

bir testtir:

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

kullanabilirsiniz deyimi dayalı farklı şeyler yapmak 'Errorlevel IF' dönüş kodu.

görme: ikinci soruya yanıt olarak

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

, Windows toplu iş dosyaları doğal olarak bu kadar sınırlı olduğu için, zaten bir kodlama dili kullanan taşınırdı. Perl, Python, Ruby, vb. Için harika Windows dağıtımları var, bu yüzden onları kullanmaman için hiçbir sebep yok, gerçekten. Şahsen Windows üzerinde Perl komut dosyası yapmayı seviyorum.

2

Aşağıdaki kod gibi bir şey yapabilirsiniz. Hata seviyesi karşılaştırmalarının cmd tuhaflığı nedeniyle azalan sırada olması gerektiğini unutmayın.

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