C#程序保持不变的错误级别

时间:2018-07-16 11:50:44

标签: c# windows error-handling

是否可以从C#中读取ERRORLEVEL,以便您可以返回它并在完成后保持不变?

程序启动时似乎Environment.ExitCode以0开头。该程序始终写入0。

  

太懒了;没读的人:以下代码不是   我想写的程序,但通过测试证明   Environment.ExitCode不继承自errorlevel,   %errorlevel%或任何以前的退出代码,以防万一。

using System;

namespace test {
    class Program {
        static void Main() {
            Console.WriteLine("{0}",Environment.ExitCode);
        }
    }
}

我的目标是编写一个程序,该程序在成批使用时不会干扰当前的错误级别,因此可以在以后使用。我知道您可以保存它并将其还原到批处理中...

...
command1 with options "or not"
set elsaved=%errorlevel%
my_cs_program run without telling it which errorlevel is
REM Damn, I cleared errorlevel, thank science I saved it before
call :setel %elsaved%
...
goto :eof

:setel
exit /b %1

...但是很麻烦。如果调用仅保留错误级别,那就更好了。

...
        static void Main() {
...
            var parent_cmd_errorlevel=exotic_funtion();
...
            Environment.ExitCode = parent_cmd_errorlevel;
...

这样,我不必在批处理中考虑它。


tl; dr :是否可以将C#程序透明写入错误级别?如果不是使用C#,是否还有其他语言?哪一个更笼统地说:cmd.exe子进程可以获取其父级的错误级别吗?也许wmic会有所帮助吗?


拒绝投票者 / 重复投票者:我知道如何指定.NET中控制台应用程序的退出代码< / em>:

...
        static void Main() {
...
            Environment.ExitCode = whatever;
...

...
        static int Main() {
...
            return(whatever);
...

我错了吗?如果您对此问题不感兴趣,请不要理会该问题,但AFAIK尚未在SO或另一个SE KB中被询问。

1 个答案:

答案 0 :(得分:0)

您无法从上一个程序读取ERRORLEVEL,但可以将其作为参数传递,然后再次进行设置:

class Program
{
    static void Main(string[] args)
    {
        Environment.ExitCode = int.Parse(args[0]);
    }
}

然后按如下所示在批处理中调用它:

cd "some path that returns an error"
.\Console1App.exe %errorlevel%

REM Print the error code of the cd command
echo %errorlevel%

请注意,这仅在未设置%errorlevel% environment 变量的情况下有效。 CMD的工作方式是,当未设置%errorlevel%时,它将通过实际的错误级别作为回退