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 n
Lậ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
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