Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поместить вывод команды в переменную

Ответить
Настройки темы
CMD/BAT - [решено] Поместить вывод команды в переменную

Новый участник


Сообщения: 44
Благодарности: 3

Профиль | Отправить PM | Цитировать


Здравствуйте. Я пытаюсь настроить тригер на громкость аудио файла.
Команда выглядит так:
Код: Выделить весь код
ffmpeg -i "%~1" -af "volumedetect" -f null nul
Вывод выглядит так:

Нужное число это mean_volume: -15.5 dB
Подскажите пожалуйста как в переменную _var поместить значение mean_volume.
Очень желательно до точки. То есть не 15.5 а 15
Спасибо.

Отправлено: 15:24, 14-06-2020

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Busla, ну уж до этого я и сам мог догадаться - так не работает.
Foreigner, да, работает. Но нельзя ли без перенаправления, и почему stderr, если после выполнения команды в переменной $error ничего нет? Хочется какого-то более "родного" решения для PS, менее костыльного.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 14:40, 16-06-2020 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


DJ Mogarych, Оно еще и по разному выводит -- в Windows PowerShell вообще бедово, а в Core, только попробовал, нормально:
Код: Выделить весь код
[string[]] $a = ffmpeg -i ".\20 - Contact Lost.flac" -af "volumedetect" -f null nul 2>&1
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:43, 16-06-2020 | #12


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Busla, ну уж до этого я и сам мог догадаться - так не работает. »
у меня почему-то работает
и на Win10 и на Win2012R2 (не конкретно с ffmpeg, а с консольными exe)

но вообще - это "магия", оно пытается интерпретировать строку как команду PoSh, зависит от конкретных атрибутов в том числе
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:19, 16-06-2020 | #13


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Почему не пользовать стандартные методы запуска файла на исполнение, ожидание завершения и чтение потоков stdout и stderr? Только не спрашивайте как, я помнить — не помню, а сил сегодня ковыряться в документации .Net нет.

Отправлено: 22:19, 16-06-2020 | #14


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
invoke-expression 'ffmpeg -i ".\20 - Contact Lost.flac" -af "volumedetect" -f null nul' -errorvariable stderr 2>$null
if ([string]$stderr -match 'mean_volume: -?(\d+)') { $matches[1] }
перенаправление выводов вряд-ли "костыль"

Отправлено: 06:41, 17-06-2020 | #15


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Iska, стандартный "метод" - Start-Process, а ваша привычка на каждый чих ковыряться в .Net - это как раз нестандартный метод

К сожалению, туда встроена своя "магия", которая не всегда корректно отрабатывает.
Из широко известных примеров - 7zip при запуске через Start-Process (или прямое обращение к System.Diagnostics.Process) изредка падает.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:55, 17-06-2020 | #16


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Busla, пусть будет Start-Process, если оно позволяет сделать искомое. А оно позволяет? В случае .Net я вижу простое:
Цитата:
Examples

The following example uses the net use command together with a user-supplied argument to map a network resource. It then reads the standard error stream of the net command and writes it to console.
Код: Выделить весь код
using (Process myProcess = new Process())
{
    ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("net ", "use " + args[0]);

    myProcessStartInfo.UseShellExecute = false;
    myProcessStartInfo.RedirectStandardError = true;
    myProcess.StartInfo = myProcessStartInfo;
    myProcess.Start();

    StreamReader myStreamReader = myProcess.StandardError;
    // Read the standard error of net.exe and write it on to console.
    Console.WriteLine(myStreamReader.ReadLine());
}
А как у нас обстоят дела со Start-Process здесь?

Цитата Busla:
Из широко известных примеров - 7zip при запуске через Start-Process (или прямое обращение к System.Diagnostics.Process) изредка падает. »
С чем это связано?

Отправлено: 21:01, 17-06-2020 | #17


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Я так понимаю, что если ffmpeg так разработан, что он все отдает через stderr, то ничего не попишешь. Пробовал и под виндоус и под линукс. Единственное, что могу сказать, pwsh гораздо лучше обработал вывод и на ходу сменил тип на стринг-массив без потери форматирования, powershell сделало тоже самое, но криво -- текст поплыл, добавились переносы. В интернете так же много информации по этому поводу. Ну вот так они сделали. Им наверное видней.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:53, 17-06-2020 | #18



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поместить вывод команды в переменную

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как записать в переменную результат выполнения команды? MSI Скриптовые языки администрирования Windows 64 24-12-2020 18:20
CMD/BAT - результат команды в переменную BreakHeart Скриптовые языки администрирования Windows 13 26-06-2019 00:15
CMD/BAT - Результат выполнения команды в переменную densan Скриптовые языки администрирования Windows 13 22-11-2018 17:38
Система - Вывод даты в переменную (bat) rootheaven Скриптовые языки администрирования Windows 6 23-07-2017 20:21
CMD/BAT - сравнение данных и вывод в переменную Anufriev Скриптовые языки администрирования Windows 9 11-06-2015 11:02




 
Переход