2014-09-02 491 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