Как узнать, успешно ли Process.Start()?

Я пробовал два разных метода для запуска процесса.

Первый

Определение определяется как параметры метода Start:

System.Diagnostics.Process.Start("excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));

Мои мысли:

Это начинается просто отлично, но я не знаю, как получить от него отзывы.

Второй

Я начал изучать ProcessStartInfo, потому что хочу знать, успешно ли начался Excel или нет - например, хотя это очень вероятно, что он существует на пользовательской машине, нет никакой гарантии, и мне было бы глупо указывать на пользователь, который он начал успешно, когда он этого не сделал.

System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo
            {
                FileName = "excel",
                Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()),
                ErrorDialog = true,
                UseShellExecute = false,
                WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            };

            try
            {
                System.Diagnostics.Process.Start(startinfo);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }

Мои мысли:

Это дает ошибку: "Система не может найти указанный файл", но неясно, означает ли это приложение Excel или мой файл. В любом случае, хотя я ценю способность сообщения об ошибке, я не должен получать информацию в данный момент.

Мысль, предложения, идеи о том, как узнать, успешно ли это произошло?

решаемые

Я поставил первый способ запуска процесса в try-catch, и он прекрасно работает.

Ответы

Ответ 1

На странице MSDN на Process.Start() указано, что этот метод имеет перегрузку типа Boolean, где значения возврата означают:

true, если запущен ресурс процесса; false, если новый ресурс процесса (например, если существующая процесс используется повторно).

Кроме того, он может использовать три исключения:

  • InvalidOperationException

В компоненте Process StartInfo не указано имя файла.

-or-

Элемент ProcessStartInfo.UseShellExecute свойства StartInfo является истинным, а ProcessStartInfo.RedirectStandardInput, ProcessStartInfo.RedirectStandardOutput или ProcessStartInfo.RedirectStandardError - true.

  • Win32Exception

При открытии связанного файла произошла ошибка.

  • ObjectDisposedException

Объект процесса уже удален.


Чтобы использовать эту перегрузку Process.Start() (которая является единственной нестатической перегрузкой метода), вам нужно создать экземпляр класса Process с помощью объекта ProcessStartInfo.

Пример этого ниже:

ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE");

Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
    // That didn't work
}

Хотя, учитывая, что это все еще возможно, вы, вероятно, лучше просто обертываете захват вокруг одного из статических методов .Start().


Учитывая, что кажется очевидным, что вызов Process.Start() будет работать или нет, и вы можете определить это из возвращаемого значения, равного 0 (или генерируемое исключение).

Как только ваш процесс запущен, вы имеете много контроля над вещами, а свойства класса Process, такие как HasExited, позволяют вам проверить, в каком состоянии находится этот процесс.

Короче говоря, если пользователь не имеет превосходства на своем компьютере, Process.Start() выдает исключение.

Ответ 2

Вы можете проверить свойство Process.ExitCode для значения 0 (успех).

Ответ 3

Process.Start() также возвращает логическое значение, которое позволяет узнать, приобрел ли он существующий процесс или был запущен новый процесс.

Кроме того, вы можете проверить ProcessId процесса, чтобы убедиться, что он запущен/запущен. Что-то вроде:

bool started = False;
Process p = new Process();
p.StartInfo = YourStartInfo;
started = p.Start();

try {
  int procId = p.Id;
}
catch(InvalidOperationException){
  started = False
}
catch(Exception ex) {
  started = False
}

Ответ 4

Чтобы точно определить, действительно ли процесс запущен, я попытался найти идентификатор процесса, если он найдет идентификатор процесса, он продолжит работу, если не сможет найти идентификатор процесса, он войдет в catch и напечатает оператор отладки.

            try
            {
                 bool pathExists = File.Exists(module.ExecutionPath);
                 if (pathExists)
                 {
                     ProcessStartInfo startArgs = new ProcessStartInfo();
                     startArgs.FileName = "C:\Windows\System32\notepad.exe";
                     startArgs.Arguments = null;

                     Process process = new Process();
                     process.StartInfo = startArgs;
                     process.Start();

                    Process startedProcess = CheckIfProcessStarted(process);
                 }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message + "  " + ex.InnerException);
                Debug.WriteLine("Couldnt find the process so it never ran");
            }

            private Process CheckIfProcessStarted(Process process)
            {
                return Process.GetProcessById(process.Id);
            }