Другая ссылка, возвращенная из Process.Start

ProcessStartInfo psi = new ProcessStartInfo(BatchFile)

Process p = Process.Start(psi)

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

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


person Saint    schedule 31.05.2011    source источник
comment
stackoverflow.com/questions/2316596/   -  person Jason Evans    schedule 31.05.2011
comment
ты имеешь в виду Process p = Process.Start(psi); ?   -  person Paolo Falabella    schedule 31.05.2011
comment
Чтобы уточнить, является ли BatchFile фактическим исполняемым файлом или это пакетный файл в обычном смысле (т. Е. Сценарий, который вызывает другие исполняемые файлы, один из которых вас интересует?). Если это первое, то оно должно быть таким, как вы ожидаете. Однако, если это последнее, то идентификатор процесса будет идентификатором процесса, выполняющего скрипт, который затем запускает интересующую программу, которая будет иметь другой идентификатор.   -  person cristobalito    schedule 31.05.2011


Ответы (3)


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

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

  • если это скрипт/bat/cmd, который порождает что-то и завершает работу (помните: вы смотрите скрипт, а не «что-то»)
  • если exe делает какое-то внутреннее вуду между exe - например, большинство офисных приложений и Internet Explorer делают это; если существует существующий процесс, он перенаправляет аргументы этому процессу для обработки и немедленно завершает работу.
person Marc Gravell    schedule 31.05.2011
comment
Точное замечание о HasExited. Но, наконец, как я могу запустить внешнюю программу и поймать ее идентификатор? - person Saint; 31.05.2011
comment
@Saint_pl, если ваша программа запуска закрывается, вам придется найти ее трудным путем ... или: не используйте панель запуска (некоторые приложения позволяют вам добавлять переключатели, чтобы сказать, что не делайте этого, но это полностью зависит от использования) - person Marc Gravell; 31.05.2011
comment
Решение - CommandLine и конкретное имя файла *.jou для распознавания запущенного процесса. - person Saint; 15.07.2011

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

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

person ChrisF    schedule 31.05.2011
comment
Нет, ID в TaskManager совершенно другой и не вписывается ни в один процесс в TaskManager - person Saint; 31.05.2011
comment
@Saint_pl - если пакетный файл просто запускает другой исполняемый файл, то его процесс не будет длиться долго, поэтому вы можете не увидеть его в диспетчере задач. - person ChrisF; 31.05.2011
comment
Если я правильно понимаю, p.ID - это идентификатор запущенного пакетного файла (например, start.bat)? Не та программа, которая запускается изнутри этого start.bat? - person Saint; 31.05.2011
comment
@ChrisF - Но если я использую msdn.microsoft.com/en-us/library /h6ak8zt5.aspx, как вы предложили, я все еще получаю другой p.ID, чем в TaskManager - person Saint; 31.05.2011
comment
@Marc Gravell - Process p = Process.Start(@C:\Program Files\MyProgram.exe, @abc -i jouFile.jou); - person Saint; 31.05.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, отображаемого в диспетчере задач.

person Alex Aza    schedule 31.05.2011