рассчитать чч: мм: сс в цикле - PullRequest
0 голосов
/ 27 марта 2020

Здравствуйте, я хотел бы добавить разные времена

, когда я запускаю этот скрипт, у меня есть эти выходные данные:

@echo off
for /f "delims=" %%f in ('"c:\MediaInfo.exe --output=General;%%Duration/String3%%\r\n c:\testmp3\*.mp3"') do (
echo %%f

)

у него есть эти выходные данные:

00:03:21.613
00:02:53.740
00:02:56.143
00:01:47.493

Я бы хотел сложить все это до суммы. Я попробовал этот скрипт

@echo off
set total=00:00:00.000
for /f "delims=" %%f in ('"c:\MediaInfo.exe --output=General;%%Duration/String3%%\r\n c:\testmp3\*.mp3"') do (
set /A total=%%f+%total%
)
echo %total%

к сожалению у меня есть это сообщение об ошибке:

Missing Operator
Missing Operator
Missing Operator
Missing Operator
total 0

в конце я хочу только минуты и секунды в переменной% total% пример: 10: 97

1 Ответ

0 голосов
/ 26 апреля 2020

Как сказал Сквошман, внутри пакетных файлов вы не можете делать арифметику времени по умолчанию.

Однако вы можете создать функциональность внутри вашего пакетного файла самостоятельно с некоторым усердием.
Я думаю, вам нужно следующее начальные точки:

Обрезка временных меток: Вывод времени должен быть разделен на часы, минуты, секунды, наносекунды. Это можно сделать с помощью %variablename:~X,Y%, где X - начальная позиция индекса (начиная с 0), а Y - длина, которую вы хотите вырезать (см. set /? для документации).
Пример: Из 00:03:21.613 получить минут вы бы сделали что-то вроде set minutes_track=%input:~3,2%.
Внутри для l oop вам нужно заранее поставить set input=%%f. Прямой способ, такой как %%f:~3,2%, невозможен (или я не знаю как).
Конечно, этот подход зависит от формата вашего вывода. Он основан на том факте, что все части дополняются начальными нулями и имеют длину только 2 цифры (кроме последней части, которая всегда имеет три цифры?). Если это не всегда так, вам нужно добавить больше logi c в анализ. Возможно, необходимо разделить двоеточие и точку (например, for /f "delims=:." %%p in (....) do ( ... ); см. for /? в этом случае).

Добавление времени с переносом: Вы можете использовать " Операторы mod или modulo "%" и "Division" / для суммирования суммирования по 60 (в секундах). См. set /? и if /? для источников документации.
Обычно вы рассчитываете общее количество минут и секунд следующим образом:

set /a seconds_new=(%seconds_total% + %seconds_track%) % 60
set /a minutes_new=(%minutes_total% + (%seconds_new% / 60)

set /a seconds_total=%seconds_new%
set /a minutes_total=%minutes_total% + %minutes_new%

Разбивка :
mod дает вам остаток, например, 79 % 60 приведет к 19, тогда как
div даст вам полный результат деления в целых числах, например: 79 / 60 доходность 1.
. При этом вы получите желаемые значения: «79 секунд - 1 минут и 19 секунд», которые вы можете сложить для общего количества time.
То же самое относится и к вычислениям часов из минут, если вы также хотите добавить эту функцию. А если вы возьмете % 1000 и / 1000, вы даже можете добавить наносекунды к секундам заранее. Также следует учитывать очень длинные треки, в которых есть часовая часть. Я оставляю это как упражнение для создания вашего скрипта;)

Важно:
Поскольку эти вычисления будут выполняться внутри для l oop в вашем случае, не забудьте использовать задержку Разверните переменные и замените %variable% на !variable! везде в моих примерах выше (см. setlocal /?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...