gpt4 book ai didi

error-handling - 批处理编程,错误处理和启动命令

转载 作者:行者123 更新时间:2023-12-04 13:43:37 25 4
gpt4 key购买 nike

我才刚刚开始学习如何编写脚本。我试图了解系统如何处理错误级别以及如何在错误处理中使用它们。我知道环境变量%ERRORLEVEL%与系统的错误级别之间存在差异。如果我正确理解这一点,那么If ERRORLEVEL 1代码将在检查前一个命令的错误级别之前检查环境变量。

因此,在我的程序中,我尝试连接一个启动/停止脚本,该脚本将启动/停止给定计算机的所有脚本(为了进行测试,我仅使用一个应用程序notepad.exe作为示例)。我有两个包装器脚本,它们通过将参数传递给独立脚本来启动或停止应用程序。如果独立脚本中存在错误,它将使用EXIT /B n
命令。一旦将控制返回给调用脚本,如果退出状态为非零,它将进入错误处理脚本。

首先,我将%ERRORLEVEL%手动设置为零,然后在START或TASKKILL命令后测试错误。但是后来我读到了清除%ERRORLEVEL%的内容SET ERRORLEVEL=是更好的方法当我尝试以以下方式启动应用程序时,出现了我的问题

START "" notepad.exe

每当我在此命令之后测试错误级别时,除非在运行启动命令之前使用SET ERRORLEVEL = 0,否则它始终大于或等于1。我已经为下面的四个脚本插入了代码。任何见识和建议将不胜感激。

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

最佳答案

您永远不要设置%errorlevel%变量。你是正确的,有区别。您从退出进程中获得的错误级别是一个内部寄存器,您可以使用%errorlevel%语法读取该寄存器。但是,如果创建一个名为ERRORLEVEL的变量,它将屏蔽内部寄存器,并且您将无法访问退出代码。

如果需要将错误级别寄存器设置为特定值,则可以使用以下命令进行操作:

%comspec% /c exit %value%

这将产生一个进程,并立即以所需的代码退出。

关于error-handling - 批处理编程,错误处理和启动命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6498460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com