Batch file 如何使用wmic查找进程pid并使用taskkill终止它

Batch file 如何使用wmic查找进程pid并使用taskkill终止它,batch-file,newline,wmic,Batch File,Newline,Wmic,我需要用WMIC命令找到一个进程PID,然后用taskkill杀死这个进程。我几乎做到了,但唯一的问题是在PID变量的末尾有一个换行符。 到目前为止,我做了以下几点: 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

我需要用WMIC命令找到一个进程PID,然后用taskkill杀死这个进程。我几乎做到了,但唯一的问题是在PID变量的末尾有一个换行符。 到目前为止,我做了以下几点:

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
这是wmic的输出循环,它包含3行:title(ProcessId)、found PID(一个数字)和一个空行。我跳过了第一行,因为这只是标题。现在我想用第二行中的pid杀死一个进程。还有一个问题,它在行尾有一个换行标记,所以整个命令不起作用。 有谁能给我一些建议我怎样才能做到?如何删除此换行标记

for /F "skip=2 tokens=2 delims=," %a in (
  'wmic process where " .... " get ProcessID^,Status /format:csv'
) do taskkill /pid %a
现在您有了一个来自
wmic
的输出,在开始处有一个传统的行(从这里开始跳过),字段用逗号分隔(delim),包括三个字段:自动添加的节点(computername)、processid(第二个令牌)以及一个最终状态字段,该字段将不被使用,但允许我们检索行中的第二个令牌,而无需结束CR

或者,您可以在初始行中添加一个传统的
for
命令

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

此传统的
for
循环将从检索到的%a中的wmic数据中删除CR字符。

我遇到了一个类似的问题,我不得不停止一个任务,只知道运行文件的名称。解决办法是:

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

抱歉,我只是注意到它是关于流程的,而不是关于服务的。它仍然可能有帮助,所以我不会删除它。谢谢你的回答。这个解决方案有效,但我发现了更简单的方法。当我们在寻找一种如此困难的方法来终止进程时,结果发现它非常简单:
wmic进程,其中“类似于“%sourceprocessor%”的命令行和类似于“%java%”的名称调用terminate
起作用:)@PatrykS,请注意
taskkill
(不带
/f
)向目标进程发送
wm_close
消息,请求其关闭
wmi Terminate
方法不太温和,直接终止进程。如果没有数据丢失的风险,则无所谓,否则,更好的方法是从
taskkill
开始,如果一段时间后进程仍在运行,则使用
taskkill/f
wmi terminate
确保进程结束。感谢您的建议,我知道这一点。幸运的是,没有数据丢失的风险,进程可以终止。