Проверить, запущена ли программа

Бывают задачи, когда в командном CMD/BAT файле необходимо проверить, запущено ли какое-то определённое приложение.
Например, командный файл резервного копирования должен дождаться завершения программы, открывшей файлы. Или командный файл должен проверять работу программы и, если она не запущена, запускать её.

Для решения этих задач надо лишь воспользоваться командой tasklist с фильтром по названию приложения.

Проверить, запущено ли приложение Microsoft Outlook (outlook.exe):

@echo off
set imagename=outlook.exe
tasklist /fi "IMAGENAME eq %imagename%" | find /i "%imagename%"
if errorlevel 1 (
    echo %imagename% не запущен
    rem Выполняем действия, требуемые при закрытом Outlook
) else (
    echo %imagename% запущен
    rem Выполняем действия, требуемые при открытом Outlook
)

Другая задача – дождаться запуска программы, чтобы выполнить какие-то действия:

@echo off
set imagename=outlook.exe
:CheckProgram
tasklist /fi "IMAGENAME eq %imagename%" | find /i "%imagename%"
if errorlevel 1 cscript.exe sleep.js 1000 && goto CheckProgram
rem Выполняем действия, требуемые при открытом Outlook

Здесь используется скрипт sleep.js, делающий задержку на 1 секунду (1000 мс), см. Как сделать задержку в командном файле.

Аналогично, дождаться завершения программы, чтобы выполнить какие-то действия:

@echo off
set imagename=outlook.exe
:CheckProgram
tasklist /fi "IMAGENAME eq %imagename%" | find /i "%imagename%"
if not errorlevel 1 cscript.exe sleep.js 1000 && goto CheckProgram
rem Выполняем действия, требуемые при закрытом Outlook

В первом примере мы хотим чтобы при закрытом Outlook он запускался, то по идее дописываем start outlook. А если к примеру нам нужен не оутлук то команда старт будет выглядеть start "C\путь до файла\файл.exe"

Так команда не сработает, поскольку если посмотреть справку по ней (start /?), то в справке вы увидите следующее:

START ["заголовок"] [/D путь] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <узел NUMA>] [/AFFINITY <маска сходства>] [/WAIT] [/B]
      [команда/программа] [параметры]

Можно пробовать разные варианты с ковычками и без указывать по разному пути но самый надежный и безотказно работающий это
cd\ C\путь до файла\
start файл.exe

Готовый вариант батника который проверит запущена ли программа и если она запущена просто прекратит свою работу если программа не запущена, запустит ее

@echo off
set imagename=файл.exe
tasklist /fi "IMAGENAME eq %imagename%" | find /i "%imagename%"
if errorlevel 1 (
echo %imagename% не запущен
rem
cd C:\путь до файла\
start файл.exe
) else (
echo %imagename% запущен
rem exit
)

Далее добавляем в диспетчер задач виндовс на запуск нашего файла по расписанию и все.

Наши работы