Войти

Показать полную графическую версию : [решено] Батник, считывающий время .mp3 и копирующий его в бефет обмена.


91892823
27-06-2012, 21:09
Необходим батник, который при запуске сканировал бы папку в которой он находится на mp3; вычислял их продолжительность, суммировал и скопировал их в буфет обмена в формате 00:00:00.

Iska
27-06-2012, 22:01
91892823, попробуйте скрипт VBScript:
Option Explicit

Const READYSTATE_COMPLETE = 4


Dim strSourceFolder

Dim objShell
Dim objFolder
Dim objFolderItem

Dim intDuration
Dim dtTotalDuration


If WScript.Arguments.Count = 1 Then
strSourceFolder = WScript.Arguments.Item(0)

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(strSourceFolder)

If Not objFolder Is Nothing Then
For intDuration = 0 To 86
If UCase(objFolder.GetDetailsOf(, intDuration)) = UCase("Длительность") Or _
UCase(objFolder.GetDetailsOf(, intDuration)) = UCase("Duration") Then

Exit For
End If
Next

dtTotalDuration = CDate("00:00:00")

For Each objFolderItem In objFolder.Items
If UCase(Right(objFolderItem.Name, 4)) = UCase(".mp3") Then
dtTotalDuration = dtTotalDuration + CDate(objFolder.GetDetailsOf(objFolderItem, intDuration))
End If
Next

With WScript.CreateObject("InternetExplorer.Application")
.Navigate("about:blank")

Do
WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE

.document.parentWindow.clipboardData.setData "text", CStr(dtTotalDuration)

.Quit
End With
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]"
End If

Set objFolder = Nothing
Set objShell = Nothing
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <Source folder>" & vbCrLf & _
"" & vbCrLf & _
"Or drag one folder into this script"
End If

WScript.Quit 0

папку в которой он находится »
Это в корне неправильный подход.

Foreigner
27-06-2012, 22:20
Потребуется консольный mediainfo:

@echo off
setlocal enabledelayedexpansion

pushd %1 || goto:eof
set "mediainfo=mediainfo --Inform=Audio;%%Duration/String3%%"

for %%i in (*.mp3) do (

for /f "tokens=1 delims=." %%j in (' !mediainfo! "%%i" ') do call:sum "%%j"

)
echo %th%:%tm%:%ts% | clip
popd
goto:eof

:sum
for /f "tokens=1-3 delims=:" %%i in (%1) do (

set /a h=1%%i-100
set /a m=1%%j-100
set /a s=1%%k-100

)

set /a th+=h
set /a tm+=m
set /a ts+=s

if %ts% geq 60 (

set /a tm+=1
set /a ts-=60

)

if %tm% geq 60 (

set /a th+=1
set /a tm-=60

)

Вызывать с параметром - путь к папке с файлами mp3. Миллисекунды не считал

91892823
27-06-2012, 22:23
Iska, спасибо. Но я ничего не смыслю в vbscript`ах, как им хоть пользоваться?

Foreigner, консольный mediainfo?
Простите за нубство..

Iska
27-06-2012, 22:54
как им хоть пользоваться? »
Сохранить код приведённого скрипта в файл с расширением «.vbs» (можно посредством Блокнота, указав кодировку ANSI при сохранении). Перетащить потребную папку на скрипт.

консольный mediainfo? »
MediaInfo_CLI_0.7.58_Windows_i386.zip (http://sourceforge.net/projects/mediainfo/files/binary/mediainfo/0.7.58/MediaInfo_CLI_0.7.58_Windows_i386.zip/download)

91892823
27-06-2012, 23:19
Iska, спасибо еще раз. Но у меня почему-то он не совсем работает, выдает только "0:00:00".. Даже не знаю в чем причина..
Foreigner, спасибо, ваш способ работает. Есть еще вопрос: что нужно исправить в батнике, чтобы консольная версия находилась в определенном месте, чтоб не копировать ее всюду?

Foreigner
27-06-2012, 23:44
чтобы консольная версия находилась в определенном месте, чтоб не копировать ее всюду?
Либо поместить в каталог, находящийся в %PATH%
set path
Либо в произвольный каталог, но прописать в батнике, например:

@echo off
setlocal enabledelayedexpansion

set "path=%path%;C:\BIN\Mediainfo"

...

Где C:\BIN\Mediainfo каталог утилиты

91892823
27-06-2012, 23:54
Foreigner, то есть так?
@echo off
setlocal enabledelayedexpansion

pushd %1 || goto:eof
set "path=%path%;C:\M\Mediainfo=mediainfo --Inform=Audio;%%Duration/String3%%"

for %%i in (*.mp3) do (

for /f "tokens=1 delims=." %%j in (' !mediainfo! "%%i" ') do call:sum "%%j"

)
echo %th%:%tm%:%ts% | clip
popd
goto:eof

:sum
for /f "tokens=1-3 delims=:" %%i in (%1) do (

set /a h=1%%i-100
set /a m=1%%j-100
set /a s=1%%k-100

)

set /a th+=h
set /a tm+=m
set /a ts+=s

if %ts% geq 60 (

set /a tm+=1
set /a ts-=60

)

if %tm% geq 60 (

set /a th+=1
set /a tm-=60

)

Iska
28-06-2012, 00:03
Но у меня почему-то он не совсем работает, выдает только "0:00:00".. Даже не знаю в чем причина.. »
Возможно в версии ОС и в ином именовании столбца (я раньше натыкался как-то на список свойств в разных ОС где-то на форуме KiXtart'а). Перетащите ту же папку на этот скрипт:
Option Explicit

Const READYSTATE_COMPLETE = 4


Dim strSourceFolder

Dim objShell
Dim objFolder
Dim objFolderItem

Dim intDuration

Dim objSWbemObjectEx
Dim strContent

If WScript.Arguments.Count = 1 Then
strSourceFolder = WScript.Arguments.Item(0)

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(strSourceFolder)

If Not objFolder Is Nothing Then
strContent = ""

For Each objSWbemObjectEx In GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").InstancesOf("Win32_OperatingSystem")
strContent = strContent & objSWbemObjectEx.Caption & " " & objSWbemObjectEx.Version & vbCrLf & vbCrLf
Next

For intDuration = 0 To 86
strContent = strContent & CStr(intDuration) & vbTab & objFolder.GetDetailsOf(, intDuration) & vbCrLf
Next

With WScript.CreateObject("InternetExplorer.Application")
.Navigate("about:blank")

Do
WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE

.document.parentWindow.clipboardData.setData "text", strContent

.Quit
End With
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]"
End If

Set objFolder = Nothing
Set objShell = Nothing
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <Source folder>" & vbCrLf & _
"" & vbCrLf & _
"Or drag one folder into this script"
End If

WScript.Quit 0

Затем выложите полученное содержимое буфера обмена сюда.

91892823
28-06-2012, 00:05
Foreigner, премного благодарен! Все работает)
вдруг кому пригодится
@echo off
setlocal enabledelayedexpansion

set "path=%path%;C:\M\"

pushd %1 || goto:eof
set "mediainfo=mediainfo --Inform=Audio;%%Duration/String3%%"

for %%i in (*.mp3) do (

for /f "tokens=1 delims=." %%j in (' !mediainfo! "%%i" ') do call:sum "%%j"

)
set "th=00%th%"
set "tm=00%tm%"
set "ts=00%ts%"

echo %th:~-2%:%tm:~-2%:%ts:~-2% | clip
popd
goto:eof

:sum

for /f "tokens=1-3 delims=:" %%i in (%1) do (

set /a h=1%%i-100
set /a m=1%%j-100
set /a s=1%%k-100

)

set /a th+=h
set /a tm+=m
set /a ts+=s

if %ts% geq 60 (

set /a tm+=1
set /a ts-=60

)

if %tm% geq 60 (

set /a th+=1
set /a tm-=60

)

Foreigner
28-06-2012, 00:08
Если надо именно 00:00:00, то можно слегка исправить вывод:

...
)
set "th=00%th%"
set "tm=00%tm%"
set "ts=00%ts%"

echo %th:~-2%:%tm:~-2%:%ts:~-2% | clip
popd
goto:eof

:sum
...


то есть так?
Нет

@echo off
setlocal enabledelayedexpansion

set "path=%path%;C:\M\Mediainfo"
pushd %1 || goto:eof
...

Где C:\M\Mediainfo каталог утилиты

Iska
28-06-2012, 00:11
(я раньше натыкался как-то на список свойств в разных ОС где-то на форуме KiXtart'а). »
Нашёл: GetExtFileProperties() - Get Extended File Properties / Attributes of Files - KiXtart.org - official site (http://www.kixtart.org/forums/ubbthreads.php?ubb=showflat&Number=201630). В новых ОС это свойство зовётся «Length» вместо «Duration». Как в новых локализованных ОС — вместо «Длительность» — не знаю.

91892823
28-06-2012, 00:12
Iska, что же, в моем случае способ Foreigner - идеален. Считаю тему закрытой. Еще раз спасибо всем за участие!

Iska
28-06-2012, 00:13
91892823, тогда ждём до утра.

Iska
28-06-2012, 18:34
91892823, попробовал (на том, что есть).

1. По поводу именования столбцов в новых ОС:
Microsoft Windows Server 2008 R2 Standard 6.1.7600

27 Продолжительность


2. Похоже, что с копированием в буфер обмена посредством объектов автоматизации «htmlfile», равно и «InternetExplorer.Application» (отваливалось по мере усиления безопасности в IE) в новых ОС придётся попрощаться. Для них потребуется либо задействовать тот же «clip.exe», либо посмотреть, как поведёт себя HTA.




© OSzone.net 2001-2012