代码之家  ›  专栏  ›  技术社区  ›  Colin

如何在我的C程序中获得由命令行扫描器设置的“ERRORLEVEL”变量?

  •  13
  • Colin  · 技术社区  · 16 年前

    在我的网站上,我想病毒检查任何上传的文件,然后再保存到我的数据库。因此,我将文件保存到本地目录,然后在我的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”)总是返回空值。它应该返回一个数字。那么,如何在我的C程序中获得命令行扫描器设置的“错误级别”?

    2 回复  |  直到 16 年前
        1
  •  17
  •   Benjamin Podszun    16 年前

    据我所知,这只是 ExitCode 你的过程。用这个。

    只有检查一下才有用 之后 等待进程结束,顺便说一句。

        2
  •  6
  •   ShuggyCoUk    16 年前

    您似乎已经翻译了一个批处理脚本,它检查了错误级别的特殊变量,或者更熟悉的Unix脚本退出代码。

    ErrorLevel是一个特殊变量,对应于 ExitCode 一个过程的

    你的密码是什么 尝试 要做的是从它自己的进程中读取一个由子进程设置的环境变量。

    在这种情况下,批处理脚本似乎正在执行此操作,它们实际上依赖操作系统的脚本环境在LAUCHED进程退出时为您更改此特殊变量。 当试图在一个功能更全面的编程环境中复制类似的功能时,这是一个问题(关于为什么这是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;
    }
    

    注意这里(和另一个答案一样),您必须首先等待进程退出,然后才能查看退出代码。