Как получить переменную «ERRORLEVEL», установленную сканером командной строки в моей программе на C #? - PullRequest
13 голосов
/ 11 января 2010

На моем веб-сайте я хочу проверить все загруженные файлы на наличие вирусов, прежде чем сохранять их в своей базе данных. Поэтому я сохраняю файл в локальном каталоге, а затем запускаю процесс сканирования командной строки из моей программы на 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 ]

17 голосов
/ 11 января 2010

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

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

6 голосов
/ 11 января 2010

Вы, похоже, перевели пакетный скрипт, который проверяет специальную переменную 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;
}

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

...