我正在尝试创建一个批处理,如果 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.
)