1

Я пытаюсь создать пакет, если IF program.exe не выполняется в процессе, он будет запускать код ниже. В vb.net это легко, но я не хочу создавать программы. Я предполагаю, что сценарий VBS будет работать, но я пытаюсь выяснить, могу ли я создать пакетную процедуру для выполнения вышеизложенного.

.летучая мышь:

@ECHO OFF

REM peudo code:

If NOT program.exe Exist

'Do something.

Выше не работает, так что мне не хватает?

4 ответа4

4

Вот, пожалуйста.

@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, чтобы определить, был ли он найден, и, если это так, выполняет код (в данном случае - эхо).

Вывод из списка задач и поиска отправляются в NULL.

Источник

1

Вот мое предложение:

@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 не знаете, почему он обнуляет его, хотя он и есть. конвейер.

Я не уверен, почему он предлагает 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 поскольку она будет поддерживать несколько строк кода.

0

Следующая работа для меня в 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.
)
0
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

Это сработало для меня.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .