Как получить переменную "ERRORLEVEL", установленную сканером командной строки в моей программе на С#?

На моем веб-сайте я хочу проверить все загруженные файлы, прежде чем сохранять их в моей базе данных. Поэтому я сохраняю файл в локальном каталоге, а затем запускаю процесс сканера из командной строки из моей программы на С#. Вот код, который я использую:

  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. Он должен возвращать число. Итак, как мне получить "ERRORLEVEL", установленный сканером командной строки в моей программе на С#?

Ответ 1

Насколько я знаю, это просто ExitCode вашего Процесса. Используйте это.

И было бы полезно проверить, что после ожидания завершения процесса, btw.

Ответ 2

Кажется, вы перевели пакет script, который проверяет специальную переменную ERRORLEVEL вместо более знакомой для кода выхода сценария unix.

ERRORLEVEL - это специальная переменная, которая соответствует ExitCode процесса.

Что ваш код пытается сделать, так это прочитать переменную среды из своего собственного процесса, как это было установлено дочерним процессом.

В этом случае пакетных скриптов, которые, как представляется, делают это, они фактически полагаются на среду сценариев операционной системы, чтобы изменить эту специальную переменную для вас, когда процесс laucnhed завершается. Это проблематично при попытке воспроизвести аналогичную функциональность в более полной функциональной среде программирования (почему это было бы плохой идеей из С#, подумайте, что произойдет, если два потока одновременно запускают два процесса).

Вместо этого у вас есть достойный 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;
}

Обратите внимание здесь (как и на другой ответ), что вы должны сначала дождаться завершения процесса, прежде чем вы сможете посмотреть код выхода.