2008-09-24 23 views
6

Tôi đang cố gắng tự động hóa chương trình mà tôi đã thực hiện với bộ thử nghiệm qua tệp .cmd..cmd và .bat mã chuyển đổi mã trả về thành thông báo lỗi

Tôi có thể lấy chương trình mà mã trả về của tôi chạy qua% errorlevel%.

Chương trình của tôi có mã trả về nhất định cho từng loại lỗi.

Ví dụ:

1 - phương tiện không cho như vậy và như vậy một lý do

2 - phương tiện thất bại vì một lý do khác

...

echo FAILED: Kiểm tra trường hợp thất bại , mức lỗi:% errorlevel% >> TestSuite1Log.txt

Thay vào đó tôi muốn bằng cách nào đó nói:

echo FAILED: Trường hợp kiểm tra không thành công, lỗi lý do: lookupError (% errorlevel%) >> TestSuite1Log.txt

Có thể với tệp .bat này không? Hay tôi phải chuyển sang một ngôn ngữ kịch bản như python/perl?

Trả lời

13

Bạn có thể làm điều này khá gọn gàng với tùy chọn ENABLEDELAYEDEXPANSION. Điều này cho phép bạn sử dụng ! làm điểm đánh dấu biến được đánh giá sau %.

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

Nhập HELP SETLOCALHELP SET tại dấu nhắc lệnh để biết thêm thông tin về mở rộng trễ.

+0

Tôi thích sự đơn giản của điều đó, câu trả lời của tôi trở lại từ những ngày trước DOS. Khi nào tùy chọn ENABLEDELAYEDEXPANSION được thêm? –

+0

Ồ, một điều cần lưu ý, lệnh "setlocal" được hiển thị ở trên sẽ ghi đè ERRORLEVEL. Hãy chắc chắn rằng setlocal được gọi trước khi lệnh đặt errorlevel (tập tin batch ở trên đối phó với điều này). –

+0

Tôi không biết khi nào nó được thêm vào không may. Tôi biết nó có sẵn trong XP và 2003 Server như tôi đã viết kịch bản bằng cách sử dụng nó chạy trên những nền tảng. Không chắc chắn các phiên bản trước đó của cửa sổ nó hoạt động trên. –

1

Không chính xác như vậy, với chương trình con, nhưng bạn có thể điền biến với văn bản bằng cách sử dụng giải pháp goto.

Có thể dễ dàng hơn nếu bộ thử nghiệm này của bạn phát triển khá nhiều để sử dụng một ngôn ngữ mạnh mẽ hơn. Perl hoặc thậm chí Windows Scripting Host có thể giúp bạn ở đó.

1

Có, bạn có thể sử dụng cuộc gọi. Chỉ trên một dòng mới có cuộc gọi, và pas mã lỗi. Điều này sẽ làm việc, nhưng tôi đã không được thử nghiệm.

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: Orry tôi có thể đã hiểu lầm một chút, nhưng bạn có thể sử dụng IF cũng

1

Kiểm tra giá trị của bạn theo thứ tự ngược và sử dụng các hành vi quá tải của NẾU:

@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 

Nếu bạn muốn mạnh hơn, bạn có thể thử một cái gì đó như thế này (bạn cần thay thế% 1 bằng% errorlevel nhưng khó kiểm tra hơn). Bạn sẽ cần phải đặt một nhãn cho mỗi mức độ lỗi bạn đối phó với:

@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 

Dưới đây là một thử nghiệm:

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

Bạn có thể sử dụng 'NẾU ERRORLEVEL' tuyên bố để làm những việc khác nhau dựa trên mã trả lại.

Xem:

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

Để đối phó với câu hỏi thứ hai của bạn, tôi sẽ chuyển sang sử dụng một ngôn ngữ kịch bản dù sao, kể từ khi các tập tin batch của Windows vốn đã rất hạn chế. Có bản phân phối Windows tuyệt vời cho Perl, Python, Ruby, v.v., vì vậy không có lý do gì để không sử dụng chúng, thực sự. Cá nhân tôi thích làm kịch bản Perl trên Windows.

2

Bạn có thể làm điều gì đó giống như mã sau. Lưu ý rằng các so sánh mức độ lỗi phải theo thứ tự giảm do một phép tính 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 
Các vấn đề liên quan