2014-09-02 488 views
4

我需要用WMIC命令找到一個進程PID,然後用taskkill殺死這個進程。我幾乎已經實現了這一點,但唯一的問題是PID變量末尾有換行符。 到目前爲止我提出這樣的:如何用wmic找到進程pid並用taskkill殺死它

c:\patryk>for /F "skip=1 tokens=*" %a in ('wmic process where "CommandLine like '%sourceprocessor%' and name like '%java%'" get ProcessId') do taskkill /pid | set /p pid=%a 

因此,這是通過含有3行WMIC的輸出循環:標題(的ProcessID),​​實測PID(數字)和一個空行。我正在跳過第一行,因爲它只是標題。現在我想殺死第二行中找到的pid進程。還有一個問題,它在行尾有一個換行標記,所以整個命令都不起作用。 任何人都可以給我一些建議,我怎麼能實現這一點?我怎樣才能刪除這個換行符?

回答

5
for /F "skip=2 tokens=2 delims=," %a in (
    'wmic process where " .... " get ProcessID^,Status /format:csv' 
) do taskkill /pid %a 

現在,你必須從wmic與在開始的aditional的線路輸出(從這裏跳過),用逗號(在DELIM)分隔的字段,以及三個字段包括:節點(計算機名)即自動添加processid(第二個標記)和最終狀態字段,該字段將不會被使用,但允許我們檢索行中的第二個標記,但不會結束CR

或者您可以將一個附加for命令添加到您的初始line

for /f ... %a in (...) do for %b in (%a) do taskkil /pid %b 

此附加的for循環將從檢索到的%a中的wmic數據中刪除CR字符。

+3

謝謝你的回答。這個解決方案有效,但我發現更容易一些。當我們正在尋找如此艱難的方式來終止進程時,結果很簡單: 'wmic進程,其中「CommandLine like'%sourceprocessor%'和名稱'%java%'」調用terminate' 做這個工作:) – 2014-09-02 11:57:11

+3

@PatrykS,只是一個音符。 'taskkill'(不帶'/ f')向目標進程發送一個'wm_close'消息,要求它關閉。 'wmi Terminate'方法並不那麼溫柔,直接殺死了這個進程。如果不存在數據丟失的風險,則無關緊要,否則,更好的方法是從「taskkill」開始,如果在一段時間後該進程仍在運行,則使用「taskkill/f」或「wmi terminate」來確保該過程結束。 – 2014-09-02 12:15:55

+0

謝謝你的建議,我知道。幸運的是,沒有數據丟失的風險,並且該過程可以終止。 – 2014-09-02 12:35:38

0

我有一個類似的問題,我不得不停止一個任務,只知道正在運行的文件的名稱。解決方案是:

for /f "tokens=2 delims=," %%a in (
    'wmic service get name^,pathname^,state /format:csv ^| findstr /i /r /c:"SomeServer\.exe.*Running$"' 
) do sc stop "%%a" 

這將按名稱停止進程。也許你可以使用文件名而不是PID?!?

+0

對不起,剛纔注意到它是關於進程而不是服務。它仍然可以幫助,所以我不會刪除它。 – MichaelS 2014-09-02 11:43:30