Другая ссылка возвращена из Process.Start - PullRequest
1 голос
/ 31 мая 2011
ProcessStartInfo psi = new ProcessStartInfo(BatchFile)

Process p = Process.Start(psi)

Почему p.ID отличается от идентификатора процесса, видимого в WindowsTaskManager

(BatchFile - путь к внешней программе с соответствующими параметрами)

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Я бы предположил, что это потому, что p.ID - это идентификатор процесса, который запускает пакетный файл, а не идентификатор процесса, запущенного с помощью пакетного файла.

Вы можете запустить исполняемый файл напрямую с помощью Process.Start, используя правильную перегрузку

2 голосов
/ 31 мая 2011

Я предполагаю, что BatchFile - это какой-то файл cmd или bat, который запускает другие процессы один за другим.
Таким образом, в диспетчере задач Windows вы фактически видите идентификаторы тех процессов, которые запускаются пакетным файлом.

Примеры

Если я сделаю это

 var p = Process.Start("notepad.exe");

p.Id будет соответствовать PID из диспетчера задач.

Однако, если я сделаю это:

 var p = Process.Start("test.cmd"); // test.cmd has notepad.exe call inside

p.Id будет отличаться от PID, отображаемого в диспетчере задач.

1 голос
/ 31 мая 2011

Идентификатор процесса имеет смысл только тогда, когда процесс жив.Первое, что нужно проверить: .HasExited - если это правда, игнорировать идентификатор процесса;он больше не имеет никакого значения.

Существует несколько способов, с помощью которых вы можете что-то запустить, и процесс не останется , хотя вы, очевидно, можете видеть его все еще на экране :

  • если это скрипт / bat / cmd, который порождает что-то и выходит (помните: вы смотрите сценарий, а не «что-то»)
  • если exe делает некоторыеinter-exe voodoo внутренне - например, большинство офисных приложений и Internet Explorer делают это;если существует существующий процесс, он передает аргументы , которые обрабатывает процесс, и немедленно завершает работу
...