【问题标题】:How do I get the "ERRORLEVEL" variable set by a command line scanner in my C# program?如何在我的 C# 程序中获取由命令行扫描程序设置的“ERRORLEVEL”变量?
【发布时间】:2010-01-11 14:56:45
【问题描述】:

在我的网站中,我想对所有上传的文件进行病毒检查,然后再将它们保存到我的数据库中。所以我将文件保存到本地目录,然后从我的 C# 程序内部启动一个命令行扫描程序进程。这是我使用的代码:

  string pathToScannerProgram = Path.Combine(virusCheckFolder, "scan.exe");
  ProcessStartInfo startInfo = new ProcessStartInfo();
  startInfo.FileName = pathToScannerProgram;
  startInfo.Arguments = String.Format("\"{0}\" /FAM /DAM", fileToScanPath);
  startInfo.RedirectStandardOutput = true;
  startInfo.WindowStyle = ProcessWindowStyle.Hidden;
  startInfo.UseShellExecute = false;

  using (Process process = new Process())
  {
    process.StartInfo = startInfo;
    process.Start();
    string output = process.StandardOutput.ReadToEnd();
    string errorLevel = Environment.GetEnvironmentVariable("ERRORLEVEL");
    process.WaitForExit();
  }

我的问题是 Environment.GetEnvironmentVariable("ERRORLEVEL") 总是返回 null。它应该返回一个数字。那么如何在我的 C# 程序中获取命令行扫描器设置的“ERRORLEVEL”呢?

【问题讨论】:

    标签: c# command-line environment-variables


    【解决方案1】:

    您似乎已经翻译了一个批处理脚本,该脚本检查 ERRORLEVEL 特殊变量代替或更熟悉的 unix 脚本退出代码。

    ERRORLEVEL 是一个特殊变量,对应于进程的ExitCode

    您的代码试图要做的是从它自己的进程中读取一个环境变量,因为它是由子进程设置的。

    在这种看似正在执行此操作的批处理脚本的情况下,它们实际上依赖于操作系统的脚本环境来在启动进程退出时为您更改此特殊变量。 当尝试在功能更齐全的编程环境中复制类似功能时,这是有问题的(为什么这对于 c# 来说是个坏主意,请考虑如果两个线程同时启动两个进程会发生什么)。

    相反,您有一个体面的 API 用于与子进程交互,惯用的等价物如下:

    using (Process process = new Process())
    {
        process.StartInfo = startInfo;
        process.Start();
        // only if you need the output for debugging
        //string output = process.StandardOutput.ReadToEnd();
        process.WaitForExit();
        return process.ExitCode;
    }
    

    请注意(与其他答案一样),您必须先等待进程退出,然后才能查看退出代码。

    【讨论】:

    • 为什么这被否决了?这与我的答案相同-尽管我认为第一部分是对问题的误解?
    • 我在解释为什么他尝试读取 ERRORLEVEL(即使它是“正常”环境变量)注定要失败(以及不等待退出) .显然有人认为我没有意识到这一点,或者认为我没有足够清楚地解释这一点。我会修改以使其更清晰
    • 你说得对,我在看一个批处理脚本。非常感谢,我赞成这个答案,因为它对我很有帮助。
    【解决方案2】:

    据我所知,这只是您的流程的ExitCode。使用它。

    而且它只会在等待进程结束之后检查 是否有用,顺便说一句。

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多