2009-08-27 40 views

回答

3

嗯,這是否可能取決於你如何執行批處理文件。

一般來說,唯一可能的方法是查看用於啓動批處理的命令行。在Windows資源管理器如果您雙擊一個批處理文件,你會得到一個像

cmd /c ""C:\Users\Me\test.cmd" " 

使用PowerShell命令行,那麼你可以在Win32_Process使用Get-WMIObject其中包括命令行:

PS Home:\> gwmi Win32_Process | ? { $_.commandline -match "test\.cmd" } | ft commandline,processid -auto 

commandline        processid 
-----------        --------- 
cmd /c ""C:\Users\Me\test.cmd" "    1028 

然而,如果您直接從命令提示符啓動批處理,那麼您無法從外部找到批處理正在運行以及是誰啓動的批處理。

+0

約翰內斯,優秀的答案。 +1請查看我的答案,以找到一個甚至可以從命令提示符調用的特定批處理文件的可能方法。如果您發現此答案有問題,請對其進行評論!謝謝。 – MagicAndi

+0

雖然,我在這裏做的是*不夠*漂亮。 – Joey

+0

約翰內斯,它不一定非常漂亮 - 它足夠好,可以得到一些有用的東西。 – MagicAndi

1

我不相信這是可行的,可靠的方式。批處理文件本身不啓動單獨的進程,而是在cmd.exe實例中運行。沒有從該特定進程導出的數據可以可靠地告訴你正在運行的文件。

一個例外是,如果cmd.exe實例專門啓動以運行批處理文件。在這種情況下,它將出現在應用程序的命令行中,並且可以對批處理文件的命令行進行grep操作。儘管在cmd.exe提示符下運行多個批處理文件,但這並不能解決正常情況。

+0

耶,有效答案的匿名downvote – JaredPar

2

我發現了一種發現正在運行的批處理文件的PID的方法。您將需要設置批次控制檯窗口的標題在批處理文件來標識它:

... 
Title MyBatchWindow 
... 

在PowerShell腳本,您可以從您的批量匹配的進程檢查MainWindowTitle屬性和檢索PID窗口標題:

$batchProcess = get-process cmd | where-Object {$_.MainWindowTitle -eq "MyBatchWindow"} 
$processID = $batchProcess .ID 
... 

我已經測試過這個方法,而且似乎都在那裏你調用通過雙擊該批處理文件,或通過命令行調用它的工作。

+1

將工作,直到你有兩個批次使用相同的窗口標題:-)。不過,我認爲你無法控制批次。 – Joey

+0

在這種情況下,我確實可以控制批次。但是,要點 - 如果您有同一批次的多個實例,則上述答案將不起作用。 – MagicAndi

+0

嗯,它會,有點......你會得到一個運行批處理的進程列表。但是你的第二行必須看起來不同,因爲你現在假設有一個返回的對象。 – Joey