批处理文件 - 如果只有一个实例运行,如何终止进程?

时间:2014-03-04 01:18:32

标签: windows batch-file process command

我正在尝试编写一个批处理程序来检查正在运行的进程“example.exe”的实例数,如果有两个或更多实例,则让它保持运行状态。但是如果只有一个实例在运行,则结束该过程。这就是我所拥有的:

@echo off
wmic process where name="example.exe" | find "example" /c > %temp%\variable.txt
set /p value=<%temp%\variable.txt
if %value% lss 2 goto endprocess
if %value% gtr 1 goto continue
:endprocess
start taskkill /f /im example.exe
:continue
ECHO continue
@echo off

我的问题是:它总是认为值是lss 2(它认为进程运行的实例少于2个)。但是,在我的任务管理器中,我可以看到显然有2个实例正在运行。我认为这可能是定义价值的问题?我不知道,我对此很陌生。有帮助吗?谢谢!

更新

好的,我现在已将其更改为此(由Magoo建议)

@echo off
wmic process where name="example.exe" | find "example" /c > "%temp%\variable.txt"
set /p value=<"%temp%\variable.txt"
if %value% equ 1 goto endprocess
if %value% neq 1 goto continue
:endprocess
start taskkill /f /im example.exe
:continue
ECHO continue
@echo off

这仍然无法正常工作,但我将实例数从1更改为0并结束了该过程。换句话说,1个进程正在运行,但是这个批处理文件认为0正在运行。现在有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我建议你的逻辑有问题。

如果找到的数字是&lt; 2 - 即0或1,则代码应转到endprocess。如果lss 2测试失败,则计数必须为3+,因此gtr 1测试将永远成功。

我不知道为什么你不使用简单的

if %value% neq 1 goto continue

甚至

if %value% equ 1 start taskkill /f /im example.exe

但是,您可能没有告诉我们您希望能够检测到其他实例计数 - 以及隐藏您正在检查的可执行文件的名称。

现在 - 向我们展示文件的内容可能非常有用。你确定文件实际上是在生成吗?如果您尝试使用"%temp%\variable.txt"而不是%temp%\variable.txt会发生什么 - 即"quote the filename"

答案 1 :(得分:1)

这在XP Pro及更高版本中使用任务列表:

@echo off
tasklist /fi "imagename eq example.exe" /nh |find /i /c "example.exe" > "%temp%\variable.txt"
set /p value=<"%temp%\variable.txt"
if %value% equ 1 taskkill /f /im example.exe
ECHO continue
@echo off

您可以使用一行而不使用临时文件 - 这会使用另一个findtr过滤器来检查某个行上的数字是否为1,然后&&是一个条件运算符如果找到1,则启动taskkill。

@echo off
tasklist /fi "imagename eq example.exe" /nh |find /i /c "example.exe"|findstr "^1$" >nul && taskkill /f /im example.exe
ECHO continue
@echo off