0

我在一个变量中捕获 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
4

5 回答 5

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

然后它就像一个魅力。

于 2011-01-03T09:17:44.430 回答
1

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

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

谢谢

于 2009-12-30T21:54:02.610 回答
1

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

插入这一行

SETLOCAL ENABLEDELAYEDEXPANSION

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

并使用!SERVICE_PID!而不是%SERVICE_PID%获取环境变量。

于 2009-12-31T11:14:06.050 回答
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进行杀死

于 2012-04-23T05:02:21.557 回答
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标志是不必要的。

于 2016-01-12T23:26:49.230 回答