Решение Мэтта Лейси хочет что-то сделать, если процесс НЕ запущен. Таким образом, он проверяет, равен ли размер вывода 0 длине (что означает, что процесс не найден)
Вы хотите что-то сделать, если процесс запущен, поэтому ваша логика инвертирована. Вам нужно проверить, равен ли вывод <> 0 (то есть процесс должен быть найден)
del search.log
tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%~zA NEQ 0 GOTO end
start alarm.wav
:end
Это можно изменить, чтобы работать без необходимости вывода файла. Обратите внимание, что вывод TASKLIST будет состоять из нескольких строк, если процесс найден, но вы хотите воспроизвести сигнал тревоги только один раз, следовательно, необходимо GOTO.
for /f %%a in ('tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV') do (
start alarm.wav
goto :break
)
:break
Примечание. Решение Matt Lacey основано на том факте, что команда TASKLIST не выдаст никакого вывода, если она не найдет процесс. Это прекрасно работает на XP. Но в Vista TASKLIST выдаст следующую строку, если не найдено ни одного соответствующего процесса - "ИНФОРМАЦИЯ: Нет запущенных задач, соответствующих заданным критериям."
Чтобы процесс работал на любой версии Windows, вам нужно сделать что-то в соответствии с тем, что предлагает Андрей М. Вот вариант, который устраняет необходимость в выходном файле
tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV | FIND /I ".exe" >nul && start alarm.wav
|
- оператор трубы. Это приводит к тому, что выходные данные команды TASKLIST передаются напрямую как входные данные для команды FIND.
(Изменить - добавлена опция /I
в случае, если имя исполняемого файла использует верхний регистр)