Показать полную графическую версию : [решено] Батник, считывающий время .mp3 и копирующий его в бефет обмена.
91892823
27-06-2012, 21:09
Необходим батник, который при запуске сканировал бы папку в которой он находится на mp3; вычислял их продолжительность, суммировал и скопировал их в буфет обмена в формате 00:00:00.
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?
Простите за нубство..
как им хоть пользоваться? »
Сохранить код приведённого скрипта в файл с расширением «.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
)
Но у меня почему-то он не совсем работает, выдает только "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 каталог утилиты
(я раньше натыкался как-то на список свойств в разных ОС где-то на форуме 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 - идеален. Считаю тему закрытой. Еще раз спасибо всем за участие!
91892823, тогда ждём до утра.
91892823, попробовал (на том, что есть).
1. По поводу именования столбцов в новых ОС:
Microsoft Windows Server 2008 R2 Standard 6.1.7600
…
27 Продолжительность
…
2. Похоже, что с копированием в буфер обмена посредством объектов автоматизации «htmlfile», равно и «InternetExplorer.Application» (отваливалось по мере усиления безопасности в IE) в новых ОС придётся попрощаться. Для них потребуется либо задействовать тот же «clip.exe», либо посмотреть, как поведёт себя HTA.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.