【问题标题】:Batch file - how to kill process if there is only one instance of it running?批处理文件 - 如果只有一个实例正在运行,如何杀死进程?
【发布时间】:2014-04-05 08:12:24
【问题描述】:

我正在尝试编写一个批处理来检查进程“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

我的问题是:它总是认为 value 是 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 正在运行。现在有什么想法吗?

【问题讨论】:

  • 我认为代码没有进入 if 语句并继续正常流程。所以每次它都会杀死进程。只是为了澄清一下,在 unix 中是否有任何名为 lss 或 gtr 的命令。因为我对unix太陌生了。但我只见过 -lt 和 -gt 命令。所以只是为了确认。

标签: windows batch-file process command


【解决方案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

你也可以用一行而不是临时文件来做 - 这使用另一个 findstr 过滤器来检查数字是否是一行上的单个1,然后&amp;&amp; 是一个条件运算符,如果它会启动 taskkill确实找到了1

@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

【讨论】:

  • 我运行的是 Windows 7。所以你是说我应该使用这种类型的代码?
  • Windows 7 比 XP Pro 更高,这也可以。
  • 好的,我试试这个...编辑:嗯...我仍然有上面提到的问题,它认为有 0 个进程实例正在运行。当我从 1 更改为 0 时,进程停止。但在 1 时,它只是转到 ECHO 继续
【解决方案2】:

我建议你的逻辑有问题。

如果找到的数字 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" 会发生什么?

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2014-09-14
    • 2018-06-25
    相关资源
    最近更新 更多