如何在批处理脚本中使用taskkill终止子进程?

时间:2009-12-30 21:42:55

标签: windows command-line batch-file kill task

我在一个变量中捕获PID,我稍后会将其删除

  IF NOT "%SERVICE_PID%" == 0 taskkill /pid %SERVICE_PID% /t /f 

虽然每次我在批处理文件中执行此操作时都会使计算机重新启动,因为它会导致某些系统进程失效

服务pid应该是从cmd

启动的用户定义服务

我不明白为什么它一直让我的机器嘶哑。

当我在命令行上运行“taskkill / pid%SERVICE_PID%/ t / f”时,它运行正常! = /

帮助!

设置SERVICE_PID

FOR /F "tokens=4 delims= " %%A IN ('sc queryex myservice ^|FIND "PID"')
 DO SET SERVICE_PID=%%A

5 个答案:

答案 0 :(得分:5)

我发现使用它会获得正确的PID:

for /f "tokens=1,2,3,4 delims=/ " %%a in ('sc queryex ServiceName ^|FIND "PID"') do set PID=%%c
taskkill /pid %PID% /t /f

然后它就像一个魅力。

答案 1 :(得分:1)

尝试删除/f选项,它强制终止进程,因此系统进程可能会在没有通知的情况下被强制终止。

我怀疑你是在试图杀死批处理脚本中的某些系统进程,因为在你的PID列表中可能还有一些系统进程ID。

由于

答案 2 :(得分:1)

确保启用延迟扩展。有关说明,请参阅帮助集。

插入此行

SETLOCAL ENABLEDELAYEDEXPANSION

作为批处理文件的第一行。

并使用!SERVICE_PID!代替%SERVICE_PID%来获取环境变量。

答案 3 :(得分:1)

  

taskkill / fi“IMAGENAME eq idsm.exe”/ fi“CPUTIME gt 00:30:00”

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
idsm.exe                      4556 Console                    0     38,328 K

我得到了这个结果,在同一个命令行中如何杀死这个进程,它应该自动运行,意味着如何使用这个PID进行查杀

答案 4 :(得分:1)

我发现这是最可靠的

net stop SERVICE_NAME
timeout /t 10
for /f "tokens=1,2,3,4 delims=/ " %%a in ('sc queryex SERVICE_NAME ^|FIND "PID"') do set PID=%%c
if not %PID% == 0 taskkill /pid %PID% /f
timeout /t 10
net start SERVICE_NAME

超时是任意的。 第一次超时使服务有机会在一段额外的时间内正常停止。 第二个超时允许操作系统做出反应,否则您最终可能会做出反应

服务正在启动或停止。请稍后再试。
,服务不会重启。

我正在检查服务是否由停止,如果不是%PID%== 0 并在必要时强制终止它。在我的情况下, / t 标志是不必要的。