批处理中使用的返回代码中的错误(当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 valueif %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不存在时)的主要内容,如果未能解决你的问题,请参考以下文章

从批处理脚本启动exe并在缺少dll时获取错误代码

代码在读取 JSON 时返回错误,并且 BigQuery SQL 的 JSON 结构中不存在引用的部分

request接收不存在的参数会是啥结果

springboot204错误

堆中的 DLL 内存泄漏

在VB6中编译DLL时“加载DLL时出错”