Как мне проверить, запущена ли названная программа в пакетном скрипте? - PullRequest
0 голосов
/ 25 мая 2020

Почему-то он говорит "отлично", даже когда программа не открыта, и даже если я ввожу имя окна вроде "asdfsd" или что-то случайное. Кто-нибудь может помочь?

@echo off
:start
tasklist | find /I "WINDOWNAME"
if errorlevel 1 (
    echo awesome
)
goto :start

1 Ответ

0 голосов
/ 25 мая 2020

Во-первых, позвольте мне порекомендовать не использовать find только для того, чтобы найти определенный заголовок окна во всем выводе tasklist, потому что строка поиска может встречаться где-то еще, например, как имя изображения, что может приводят к ложным совпадениям.

В любом случае команда tasklist не устанавливает код выхода (ErrorLevel) , когда фильтр /FI не находит совпадение, но вы можете проверить, начинается ли вывод с INFO:, что имеет место, когда совпадений не обнаружено:

:start
timeout /T 1
tasklist /FI "WindowTitle eq WindowName" | findstr /B "INFO:" > nul && (echo goto :start) || (echo awesome)`.

Это зависит от возвращаемой одиночной строки в случае отсутствия совпадений:

INFO: No tasks are running which match the specified criteria.

Этот текст зависит от локали / региона / языковых настроек системы. Чтобы сделать это даже независимым от локали, вы можете использовать уловку: tasklist с форматом вывода по умолчанию (/FO TABLE) возвращает более одной строки, когда встречается хотя бы совпадение, потому что есть двухстрочный заголовок, за которым следуют фактически совпадающие элементы; если совпадений нет, возвращается только указанная выше строка. Так что захватите вывод tasklist с помощью for /F l oop, используя опцию skip=1. Затем for /F l oop установит код выхода на 1 (но не на ErrorLevel), когда он не повторяется, и на 0, когда он повторяется хотя бы один раз. Этот код выхода можно проверить с помощью операторов условного выполнения && и ||:

:start
timeout /T 1
(for /F "skip=1" %%I in ('tasklist /FI "WindowTitle eq WindowName"') do rem/) && (echo awesome) || (goto :start)

Я вставил команду timeout , чтобы избегайте высоких нагрузок на ЦП с помощью goto :start l oop.

...