批处理 IF .exe 未运行

批处理 IF .exe 未运行

我正在尝试创建一个批处理,如果 program.exe 未在进程中运行,它将运行下面的代码。在 vb.net 中这很容易,但我不想创建程序。我猜 VBS 脚本会起作用,但我正在尝试看看是否可以创建一个批处理例程来执行上述操作。

。蝙蝠:

@ECHO OFF

REM peudo code:

If NOT program.exe Exist

'Do something.

上述方法不起作用,那么我遗漏了什么?

答案1

在这里你去:

@echo off
tasklist /FI "IMAGENAME eq program.exe" 2>NUL | find /I /N "program.exe" >NUL
if "%ERRORLEVEL%"=="0" echo Program is running.

它使用 Tasklist.exe 获取与您的程序名称匹配的任务列表,然后使用 find 来确定该程序是否确实存在于列表中。

然后,它使用 find 返回的错误代码来确定是否找到,如果找到,则执行代码(在本例中为 echo)。

Tasklist 和 Find 的输出被发送到 NULL。

来源

答案2

以下是我的建议:

@echo off
tasklist /FI "IMAGENAME eq program.exe" | findstr "program.exe" >nul
if %ERRORLEVEL% == 1 goto mycode
goto eof
:mycode

rem put your code here

:eof
exit

就像@techie007 建议的那样,我会推荐它tasklist /FI "IMAGENAME eq program.exe",因为它只输出完全匹配,所以当你搜索时cmd.exe你不会命中,htcmd.exe不确定为什么他会将它 NULL,因为它正在被管道传输。

我不知道为什么他建议find /I /N我个人更喜欢它,findstr因为它用途更广泛,但在他的建议中它可以完成工作。

最后一部分是我的建议与@techie007 的建议不同的地方,if %ERRORLEVEL% == 1 goto mycode goto eof这将作为 if else 语句工作,因此如果程序没有运行,则转到mycode(您将在其中填充好...您的代码),否则转到eof将退出批处理。

我对@techie007 的唯一不满是if "%ERRORLEVEL%"=="0" echo Program is running.,无论这是真还是假,它都会运行下一行代码。这就是为什么我想推荐使用一种goto方法,因为它将支持多行代码。

答案3

echo off
SETLOCAL EnableExtensions
set EXE=YourProgram.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
echo Not running
pause
goto FIN
:FOUND
echo Running
pause
:FIN

这对我有用。

答案4

以下内容在 Windows 7 中对我有用。

tasklist | findstr /i "appName.exe" > nul && echo Yeah || echo Nope

当找到时&&,将运行同一行上的之后的命令,并跳过同一行上的之后的命令。否则,当找不到时,它将跳过 之后的命令并执行 之后的命令。findstr"appName.exe"||findstr"appName.exe"&&||

如果您想要多个成功和/或失败的命令:

tasklist | findstr /i "appName.exe" > nul && ( 
    echo.Yeah
    echo.It's running.
) || (
    echo.Nope
    echo.Don't hope.
)

相关内容