WMIC 进程列表然后终止?

WMIC Process List and then terminate?

编辑 @aschipfl - 你的反应很完美!答案如下。

历史.. 为什么要这样做? 99.9% 的时间,我们可以简单地执行以下操作:

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

而且效果很好。然而,曾经有过这样的情况,我们 Tomcat 会留在记忆中而不是停下来。所以我们必须终止它。我必须每月一次在大约 40 台服务器上添加我们的供应商提供的 "signature" 文件,我必须 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 做一个通配符,我认为它正在添加一个额外的马车 return..

Ref.. 我确实在这里找到了一些有趣的信息: 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

谢谢!

额外的回车-return来自wmic命令(与是否使用通配符无关)。 wmic 输出 Unicode 文本,通过 for /F 转换为 ASCII 不能完美工作。

要去掉额外的回车-return,只需将另一个 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值。