我正在尝试编写一个批处理程序来检查正在运行的进程“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正在运行。现在有什么想法吗?
答案 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