WMIC流程列表然后终止?

时间:2015-11-06 17:55:42

标签: windows batch-file service terminate wmic

编辑 @aschipfl - 您的回复非常完美!答案如下。

史.. 为什么这样? 99.9%的时间,我们只需执行以下操作:

WMIC service where "name like 'tomcat%%'" CALL stopservice

它工作正常。然而,有一个场合,我们会让Tomcat留在记忆中而不是停下来。所以我们必须终止它。我必须添加"签名"我们的供应商每月在大约40台服务器上提供的文件,我必须100%确定我能够毫无问题地这样做。我们的大多数问题似乎都与Tomcat7和JDK7有关,并且有一些内存调整。

我的批处理脚本中有以下内容,这两种方法都很有用。

WMIC Path win32_process WHERE "CommandLine Like '%%tomcat%%'" CALL Terminate
WMIC Path win32_process WHERE "CommandLine Like '%%java%%'" CALL Terminate

但是,我真的不想终止tomcat6w.exe或tomcat7w.exe。我真正想做的是终止tomcat?.exe,但不终止:tomcat?w.exe

当我尝试以下操作时,我刚刚杀了我的服务器 - doh !!

WMIC service where "name like 'tomcat%%'" get processid | WMIC Path win32_process WHERE "processid = processid" CALL Terminate

我想我可以做到以下几点,但还没有工作:

for /F "skip=1" %%a in ('WMIC service where "name like 'tomcat%%'" get processid') do set pid=%%a
WMIC Path win32_process WHERE "processid = %pid%" CALL Terminate

但是,由于我正在使用tomcat进行通配符,我认为它正在添加额外的回车符。

参考..我确实在这里找到了一些有趣的信息: http://www.dostips.com/forum/viewtopic.php?f=3&t=3815

希望这有道理吗?

答案

FOR /F "skip=1" %%a IN ('WMIC service where "name like 'tomcat%%'" get processid') DO (
FOR /F "delims=" %%b IN ("%%a") DO SET pid=%%b
)
WMIC Path win32_process WHERE "processid = %pid%" CALL Terminate
pause

谢谢!

1 个答案:

答案 0 :(得分:2)

额外的回车来自wmic命令(与您是否使用通配符无关)。 wmic输出Unicode文本,for /F转换为ASCII无效。

要摆脱额外的回车,只需将另一个for /F循环包裹起来:

for /F "skip=1" %%a in ('WMIC service where "name like 'tomcat%%'" get processid') do for /F "delims=" %%b in ("%%a") do set pid=%%b

因此变量pid包含纯进程ID值。