2011-05-31 23 views
1
返回
ProcessStartInfo psi = new ProcessStartInfo(BatchFile) 

Process p = Process.Start(psi) 

爲什麼p.ID比進程id不同可見WindowsTaskManager不同的參考距離的Process.Start

BatchFile是路徑與適當的參數外部程序)

+0

http://stackoverflow.com/questions/2316596/system-diaganostics-process-id-isnt-the -same-process-id-shown-in-task-manger-wh – 2011-05-31 08:17:56

+0

你的意思是'Process p = Process.Start(psi);'? – 2011-05-31 08:20:05

+0

爲了說明,BatchFile是一個真正的可執行文件,還是它是一個「正常」意義上的批處理文件(即調用其他可執行文件的腳本,其中一個是您感興趣的文件?)。如果它是前者,那麼它應該如你所期望的那樣。但是,如果是後者,那麼進程ID將是執行腳本的進程的ID,然後該腳本將啓動感興趣的程序,該程序將具有不同的ID。 – cristobalito 2011-05-31 08:22:09

回答

1

進程ID啓動可執行文件是唯一有意義的,而這個過程是活的。首先要檢查的是.HasExited - 如果是這樣,忽略進程ID;它不再有任何意義。

有很多,你可以開始做,沒有任何過程中遺留即使你能明顯看到它仍然在屏幕上方式:

  • ,如果它是一個腳本/ BAT/CMD會派生的東西並退出(請記住:您正在看劇本,而不是「某些東西」)
  • 如果exe在內部執行某些inter-exe voodoo - 例如,大多數辦公應用程序和Internet Explorer都這樣做;如果有一個現有的流程,將其轉發參數傳遞給進程來處理,並立即退出
+0

關於HasExited的精確觀察。但最後我怎麼能運行外部程序,並趕上它的ID? – Saint 2011-05-31 11:27:45

+0

@Saint_pl如果你的啓動程序正在退出,那麼你將不得不以困難的方式找到它......或者:不要使用啓動程序(有些應用程序允許你添加開關來說「不要那麼做」,但是這完全是特定用法) – 2011-05-31 11:33:22

+0

解決方案是CommandLine和文件名specific * .jou來識別正在運行的進程 – Saint 2011-07-15 15:47:25

2

我以爲批處理文件是某種形式的cmd或一個接一個地運行其他進程的bat文件。
因此,在Windows任務管理器中,您實際上可以看到由批處理文件運行的那些進程的ID。

例子

如果我這樣做

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不同。

2

我會假設,這是因爲p.ID是正在運行的批處理文件,而不是進程的ID通過批處理文件啓動的進程的ID。

您可以直接通過Process.Start使用correct overload

+0

不,TaskManager中的ID完全不同,並且不適合任務管理器中的任何進程 – Saint 2011-05-31 08:24:24

+0

@Saint_pl - 如果批處理文件剛剛啓動另一個exe,那麼它的進程不會持續很長時間,因此您可能不會看到它是任務管理器。 – ChrisF 2011-05-31 08:25:50

+0

如果我理解正確 - p.ID是運行批處理文件的標識(例如「start.bat」)?不是從這個start.bat裏面運行的這個程序嗎? – Saint 2011-05-31 08:31:02