Как проверить, запущен ли процесс через пакетный скрипт - PullRequest
236 голосов
/ 02 октября 2008

Как я могу проверить, запущено ли приложение из пакетного (хорошо cmd) файла?

Мне не нужно запускать другой экземпляр, если программа уже запущена. (Я не могу изменить приложение, чтобы оно было только одним экземпляром.)

Также приложение может работать от имени любого пользователя.

Ответы [ 17 ]

2 голосов
/ 02 октября 2008

Я не знаю, как это сделать со встроенным CMD, но если у вас есть grep , вы можете попробовать следующее:

tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"
1 голос
/ 11 мая 2018

Просто упомяните, что если имя вашей задачи действительно длинное, тогда оно не будет полностью отображаться в результате tasklist, поэтому может быть безопаснее (кроме локализации) проверить обратное.

Вариация этот ответ :

:: in case your task name is really long, check for the 'opposite' and find  the message when it's not there
tasklist /fi "imagename eq yourreallylongtasknamethatwontfitinthelist.exe" 2>NUL | find /I /N "no tasks are running">NUL
if "%errorlevel%"=="0" (
    echo Task Found
) else (
    echo Not Found Task
)
0 голосов
/ 02 октября 2008

Вы должны проверить имя родительского процесса, см. Статья проекта Code о .NET решении **.

Непрограммный способ проверки:

  1. Запустить Cmd.exe
  2. Запустить приложение (например, c:\windows\notepad.exe)
  3. Проверьте свойства процесса Notepad.exe в Process Explorer
  4. Проверка на родительский процесс (Это показывает cmd.exe)

То же самое можно проверить, получив имя родительского процесса.

0 голосов
/ 23 июня 2010

Я использовал скрипт , предоставленный Мэттом (2008-10-02). Единственное, с чем я столкнулся, было то, что он не удалял файл search.log. Я ожидаю, потому что мне пришлось cd в другое место, чтобы начать свою программу. Я cd вернулся бы туда, где находятся BAT-файл и search.log, но он все равно не удалился. Поэтому я решил это, удалив файл search.log первым, а не последним.

del search.log

tasklist /FI "IMAGENAME eq myprog.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%-zA EQU 0 GOTO end

cd "C:\Program Files\MyLoc\bin"

myprog.exe myuser mypwd

:end
0 голосов
/ 02 октября 2008

Я предполагаю, что окна здесь. Итак, вам нужно использовать WMI, чтобы получить эту информацию. Посмотрите в архиве сценариста множество примеров использования WMI из сценария.

0 голосов
/ 22 марта 2017

Я обычно выполняю следующую команду в командной строке cmd, чтобы проверить, запущен ли мой program.exe:

tasklist | grep program
0 голосов
/ 18 сентября 2013

Опираясь на ответ vtrz и Ответ Сэмюэля Ренкерта на другую тему , я придумал следующий скрипт, который запускается %EXEC_CMD% только если он еще не запущен:

@echo off
set EXEC_CMD="rsync.exe"
wmic process where (name=%EXEC_CMD%) get commandline | findstr /i %EXEC_CMD%> NUL
if errorlevel 1 (
    %EXEC_CMD% ...
) else (
    @echo not starting %EXEC_CMD%: already running.
)

Как было сказано ранее, для этого требуются права администратора.

...