【发布时间】:2020-01-21 14:32:43
【问题描述】:
我正在从 Batch 启动一个程序,但如果该程序已经在运行,我想避免启动第二个实例。
到目前为止,我已经编写了以下代码,它似乎可以工作:
TASKLIST /FI "IMAGENAME eq speedfan.exe" | FIND "speedfan.exe" >NUL
IF %ERRORLEVEL%==0 (
TASKKILL /F /IM speedfan.exe
)
START "" "C:\Program Files (x86)\SpeedFan\speedfan.exe"
或者,如果我想保留当前实例而不是开始一个新实例:
TASKLIST /FI "IMAGENAME eq speedfan.exe" | FIND "speedfan.exe" >NUL
IF NOT %ERRORLEVEL%==0 (
START "" "C:\Program Files (x86)\SpeedFan\speedfan.exe"
)
这可以改进/简化吗?
更新:感谢大家的 cmets!到目前为止,我修改后的代码变成了:
TASKLIST /FI "IMAGENAME eq speedfan.exe" | FINDSTR /BLI "speedfan.exe " >NUL || (
START "" "C:\Program Files (x86)\SpeedFan\speedfan.exe"
)
(为了简单起见,我可能会删除 /FI "IMAGENAME eq speedfan.exe" 部分)
【问题讨论】:
-
TASKLIST /FI "IMAGENAME eq speedfan.exe" | FIND "speedfan.exe" >NUL || START "" "C:\Program Files (x86)\SpeedFan\speedfan.exe" -
如图所示,可以使用条件执行。
&&表示如果上一个命令成功则执行此命令。||表示如果上一个命令不成功,则执行此命令。 -
您可以像使用
IF命令一样在条件执行中使用括号。您实际上是在尽可能高效地完成这项任务。如果您想减慢它的速度,请随时使用WMIC或Powershell来查看任务是否正在运行。 -
你也可以缩短你的初始命令行长度,
TASKLIST /FI "IMAGENAME eq speedfan.exe" | FIND "speedfan.exe"可以是TASKLIST | FIND /I "speedfan.exe "。 这假设您没有另一个名称以speedfan.exe结尾的可执行文件 -
为了健壮性,您可以缩短它,但使用
FindStr而不是Find。例如,TASKLIST | FINDSTR /I "\<speedfan\.exe\>"或TASKLIST | FINDSTR /BLI "speedfan.exe "。
标签: windows batch-file process task