2011-06-27 32 views
6

Tôi chỉ mới bắt đầu học cách viết kịch bản. Tôi đang cố gắng để hiểu làm thế nào hệ thống xử lý các cấp độ lỗi và làm thế nào chúng có thể được sử dụng trong xử lý lỗi. Tôi biết có sự khác biệt giữa biến môi trường% ERRORLEVEL% và Mức Lỗi của hệ thống. Nếu tôi hiểu chính xác điều này, thì mã số If ERRORLEVEL 1 sẽ kiểm tra biến môi trường trước khi kiểm tra mức lỗi của lệnh trước đó. Vì vậy, trong chương trình của tôi tôi đang cố gắng để giao diện một script khởi động/dừng sẽ bắt đầu/dừng tất cả các kịch bản của một máy nhất định (để thử nghiệm tôi chỉ sử dụng một ứng dụng notepad.exe làm ví dụ). Tôi có hai kịch bản trình bao bọc sẽ khởi động hoặc dừng các ứng dụng bằng cách chuyển các đối số cho tập lệnh độc lập. Nếu có lỗi trong tập lệnh độc lập, nó sẽ đặt errorlevel bằng cách sử dụng lệnh EXIT /B nLập trình hàng loạt, xử lý lỗi và bắt đầu lệnh

. Khi điều khiển được trả lại cho tập lệnh gọi, tập lệnh sẽ chuyển đến tập lệnh xử lý lỗi nếu trạng thái thoát không khác.

Lúc đầu, tôi đã đặt% ERRORLEVEL% thành 0 theo cách thủ công và sau đó kiểm tra lỗi sau lệnh START hoặc TASKKILL. Nhưng sau đó tôi đọc rằng việc xóa% ERRORLEVEL% với SET ERRORLEVEL= là một phương pháp tốt hơn. Vấn đề của tôi đến trong khi tôi cố gắng để bắt đầu ứng dụng với

START "" notepad.exe 

Bất cứ khi nào tôi thử nghiệm các errorlevel sau khi lệnh này nó luôn luôn lớn hơn hoặc bằng 1 trừ khi tôi sử dụng SET ERRORLEVEL = 0 trước khi tôi chạy lệnh bắt đầu. Tôi đã chèn mã cho bốn tập lệnh bên dưới. Bất kỳ cái nhìn sâu sắc và tư vấn sẽ được đánh giá rất nhiều.

appstart.bat:

@echo off 
:: Script for application Start 
set ERRORLEVEL= 
:: **** 
:: Additional Batch files will be executed from within this file 
:: Example: 
::  Call Appbat01.bat 
:: The called batch file should set ERRORLEVEL non-zero if error 
:: **** 

call test.bat -start 
if ERRORLEVEL 1 (call error.bat) 
echo. 
echo Control was returned to appstart.bat... 
:: **** End Calls 
goto end 

:end 

appstop.bat:

@echo off 
:: Script for application Start 
set ERRORLEVEL= 
:: **** 
:: Additional Batch files will be executed from within this file 
:: Example: 
::  Call Appbat01.ba 
:: The called batch file should set ERRORLEVEL non-zero if error 
:: **** 

call test.bat -stop 
if ERRORLEVEL 1 (call error.bat) 
echo. 
echo Control was returned to appstop.bat... 
:: **** End Calls 
goto end 

:end 

test.bat:

@echo off 
if "%1"=="-start" goto :start 
if "%1"=="-stop" goto :stop 
goto wrongParams 

:start 
::**** 
:: Insert start up stripts here... 
:: If there is an error, set ERRORLEVEL=1 
::**** 
    set ERRORLEVEL=0 
    echo. 
    echo ******** 
    echo starting the service... 
    echo. 
    ::start "" "C:\Program Files\Microsoft Office\office11\winword.exe" 
    start notepad.exe 
    if ERRORLEVEL 1 goto error 
    qprocess notepad.exe 
    echo *Start.success* ERRORLEVEL is: %ERRORLEVEL% 
    echo. 
    goto end 

:stop 
::**** 
:: Insert stopping stripts here... 
:: If there is an error, set ERRORLEVEL>1 
::**** 
    set ERRORLEVEL=0 
    echo. 
    echo ******** 
    echo stopping the service... 
    echo. 
    qprocess notepad.exe 
    taskkill /f /im notepad.exe 
    if ERRORLEVEL 1 goto noProcess 
    goto end 

:noProcess 
    set ERRORLEVEL=2 
    echo *noProcess* ERRORLEVEL is now: %ERRORLEVEL% 
    echo. 
    exit /b 2 
:error 
:: Errorhandler. Log application status and cause of error here. Set 
:: ERRORLEVEL > 1 before returning to caller. 
    set ERRORLEVEL=1 
    echo. 
    echo **** Error handler inside test.bat **** 
    echo. 
    echo *error* ERRORLEVEL is now: %ERRORLEVEL% 
    echo. 
    exit /b 1 

:wrongParams 
:: Output an error if the wrong parameters were passed to this script. 
:: Maybe try to self correct the parameter... 
    set ERRORLEVEL=1 
    echo. 
    echo '%1' is an invalid parameter. 
    echo Usage: %0 [-stop ^| -start] 
    echo *wrongParams* ERRORLEVEL is now: %ERRORLEVEL% 
    echo. 
    exit /b 1 
:end 

error.bat:

@echo off 
echo **** You have reached error.bat **** 
echo ERRORLEVEL inside of error.bat is: %ERRORLEVEL% 
echo. 
::*** Handle error...*** 
goto error%ERRORLEVEL% 

:error2 
    echo The process could not be stopped for some reason. 
    goto end 
:error1 
    echo The process had an error in start up. 
::***    *** 
    goto end 

:end 
+0

Nếu bạn đang chạy mã, đây là nơi tôi gặp lỗi. Nếu tôi sử dụng bắt đầu, nó sẽ kích hoạt notepad tốt mà không có bất kỳ lỗi nào. Nếu tôi sử dụng dừng, nó dừng notepad mà không có bất kỳ lỗi nào. Nếu tôi sử dụng dừng lại một lần nữa, nó ném một lỗi như mong đợi. Bây giờ, nếu tôi sử dụng bắt đầu, nó sẽ bắt đầu lên notepad mà không có bất kỳ lỗi một lần nữa. Tuy nhiên, câu lệnh if sau lệnh START là true và nó sẽ bị lỗi. Tôi không chắc tại sao điều này lại xảy ra. Hãy giúp tôi! – grocky

Trả lời

12

Bạn không bao giờ nên đặt biến% errorlevel%. Bạn đúng là có sự khác biệt; Lỗi errorlevel mà bạn nhận được từ một quá trình thoát là một thanh ghi bên trong mà bạn có thể đọc với cú pháp% errorlevel%. Tuy nhiên, nếu bạn tạo một biến có tên là ERRORLEVEL, nó sẽ che dấu thanh ghi bên trong và bạn mất quyền truy cập vào các mã thoát.

Nếu bạn cần phải thiết lập sổ đăng ký errorlevel đến một giá trị cụ thể, bạn có thể làm điều đó với lệnh sau:

%comspec% /c exit %value% 

này sẽ đẻ trứng một quá trình mà ngay lập tức thoát với mã mong muốn.

+0

Tuyệt vời! Tôi đã có thể chạy các tập lệnh mà không có bất kỳ lỗi không mong muốn nào.Tôi đã cố gắng không thiết lập ERRORLEVEL trực tiếp trước đây, nhưng tôi không thể làm cho nó để thiết lập lại trước khi tôi chạy lệnh tiếp theo. Nhưng bây giờ tôi đặt ERRORLEVEL về 0 bằng cách sử dụng lệnh bạn đã đưa ra trong tập lệnh error.bat sau khi nó kết thúc xử lý lỗi. – grocky

Các vấn đề liên quan