Как запустить файл wav, если программа запущена через пакетный скрипт - PullRequest
1 голос
/ 28 января 2012

Я пытаюсь воспроизвести файл wav, когда мой клиент vpn отключается.

По совету Мэтта Лейси из Как проверить, запущен ли процесс с помощью пакетного сценария

У меня есть следующее:

del search.log
tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end
start alarm.wav
:end

Когда содержимое файла search.log пусто, воспроизводится alarm.wav.
Но я не хочу, чтобы он воспроизводился, когда search.log пуст. Я хочу, чтобы он воспроизводился, когда в search.log есть такая информация, как:

"Image Name","PID","Session Name","Session#","Mem Usage"
"vpngui.exe","2408","Console","0","10,496 K"

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 28 января 2012

Решение Мэтта Лейси хочет что-то сделать, если процесс НЕ запущен. Таким образом, он проверяет, равен ли размер вывода 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 в случае, если имя исполняемого файла использует верхний регистр)

1 голос
/ 28 января 2012

Вы можете проверить фактическое содержимое файла журнала с помощью команды FIND, а затем выполнить требуемое действие, основываясь на результатах теста. Вот как:

del search.log
tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV > search.log
FIND ".exe" < search.log > NUL && start alarm.wav

Команда FIND будет искать строку .exe в файле журнала. (Вы могли бы ожидать, что это будет содержать .exe, если предыдущая команда действительно нашла запрошенную программу в списке процессов.) Фактическая строка в данный момент не важна, поэтому мы отбрасываем FIND ' выходной сигнал (> NUL). Важным является тот факт, что линия вообще найдена. Если это так, будет вызвана команда, следующая за &&, т.е. start alarm.wav. Если нет, то тревоги не будет.

...