Пакетный IF .exe не работает

1

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

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

@ECHO OFF

REM peudo code:

If NOT program.exe Exist

'Do something.

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

Бенджамин Джонс
источник
1
Вы можете направить список задач в findstr и запустить код ошибки, извините по телефону, поэтому не можете опубликовать пример
50-3
1
tasklist | findstr program.exeвы получите одну строку, если найдете, и никаких строк, если нет.
Фрэнк Томас
Ваш пример псевдокода проверяет, существует ли на диске файл FILE program.exe, а не процесс в памяти. PS: это будет `Если НЕ СУЩЕСТВУЕТ program.exe '.
Ƭᴇcʜιᴇ007

Ответы:

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.

Источник

Ƭᴇcʜιᴇ007
источник
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методологию, поскольку она будет поддерживать несколько строк кода.

50-3
источник
Единственная строка: «if»% ERRORLEVEL% »==« 0 »echo Программа запущена.». Команда Echo будет запускаться только в том случае, если результат равен True (уровень ошибки равен 0). Нет следующей строки кода. Хотя он будет работать независимо от того, существует ли он, это только потому, что он находится вне блока IF. :)
Ƭᴇcʜιᴇ007
Кроме того, в Windows Vista (7?) И выше :eofметка теперь встроена в Goto: «Команда GOTO теперь принимает целевую метку: EOF, которая передает управление в конец текущего файла пакетного сценария. Это простой способ выйти из файла пакетного сценария без определения метки. " ( goto /?) :)
Ƭᴇcʜιᴇ007
GOTO:eofэто тот, который я имею в виду, и да, он работает на большинстве систем, я просто предпочитаю использовать расширенный метод для обучения
50-3
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

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

Mdsoebee
источник
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.
)
acegs
источник