批处理中使用的返回代码中的错误(当DLL不存在时)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理中使用的返回代码中的错误(当DLL不存在时)相关的知识,希望对你有一定的参考价值。
我有一个奇怪的错误,我不知道是什么导致它我有一个非常简单的控制台应用程序与try-catch
static int Main()
{
int returncode = 0;
try
{
//some processing
}
catch
{
returncode = 1;
}
return returncode;
}
和批处理文件
echo off
theprogram.exe
if errorlevel 1 goto Error
if errorlevel 0 goto Sucesss
echo I dont know what happened
echo %errorlevel%
goto :EOF
:Error
echo There was an error
goto :EOF
:Sucess
echo Completed Succesfully
goto :EOF
当我在成功条件下执行批处理文件时,它运行良好。但是当我在失败条件下执行它时,即使返回值为1,我有时会得到255,有时候会得到-532462766 ......
我迷路了为什么......(我不习惯使用批处理文件)
编辑:我做了更多的实验。该代码使用DLL。如果该DLL不存在,则会发生上述情况。我猜测当DLL不存在时,它将抛出一个异常,它将被catch捕获,因此返回代码为1,但似乎不会发生
甚至更奇怪的是,如果我故意抛出“DLLNotFoundException”,它运行良好
try
{
throw new DllNotFoundException();
}
catch
{
returncode = 1;
}
但是当实际的DLL不存在时却没有
答案
这是你的(.bat)代码稍加修改(code.bat):
@echo off
call inner.bat %~1
echo ERRORLEVEL: %ERRORLEVEL%
if "%ERRORLEVEL%" equ "0" (
goto :success
)
:error
echo There was an error
goto :eof
:success
echo Completed Succesfully
goto :eof
inner.bat:
if "%~1" neq "" (
echo Inner script: exiting with %~1
exit /b %~1
) else (
echo Inner script: exiting with 0
exit /b 0
)
笔记:
- inner.bat - 是theprogram.exe的替代品:
返回它作为第一个参数接收的任何值(相当于为进程设置ExitCode的
return
语句),如果没有提供,则返回0。检查[SS64]: Command Line arguments (Parameters)有关参数的更多详细信息,以及[SS64]: IF - code.bat:
使用第一个参数调用inner.bat(我这样做是为了参数化整个事情,所以如果需要不同的行为,只需为参数传递一个不同的值而不是修改代码)
改变了检查内部过程是否以错误结束的方式:而不是
if ERRORLEVEL value
做if %ERRORLEVEL equ 0
(虽然有些人可能认为这是不正确的,并且在某些情况下它会产生意想不到的结果)。更多细节,再次在[SS64]: %Errorlevel% 这样,0表示成功,其他一切(正值或负值)表示错误:error
标签(仅标签行,而不是它后面的2行)不再需要,但我把它留在那里 还做了一些代码和输出格式
输出:
E:WorkDevStackOverflowq048860316>code.bat -23456 Inner script: exiting with -23456 ERRORLEVEL: -23456 There was an error E:WorkDevStackOverflowq048860316>code.bat Inner script: exiting with 0 ERRORLEVEL: 0 Completed Succesfully E:WorkDevStackOverflowq048860316>code.bat 12 Inner script: exiting with 12 ERRORLEVEL: 12 There was an error E:WorkDevStackOverflowq048860316>code.bat 0 Inner script: exiting with 0 ERRORLEVEL: 0 Completed Succesfully
- 现在,无论C#程序的ExitCode(错误情况为!= 0)都是如此,它将由.bat正确处理
- 在C#中可能会有一些错误的错误处理,这会使进程以错误的ExitCode退出,但是在这种情况下.bat没有什么可以做的
以上是关于批处理中使用的返回代码中的错误(当DLL不存在时)的主要内容,如果未能解决你的问题,请参考以下文章