Во-первых, позвольте мне порекомендовать не использовать 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.