Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Батник, считывающий время .mp3 и копирующий его в бефет обмена. (http://forum.oszone.net/showthread.php?t=237425)

91892823 27-06-2012 21:09 1941648

Батник, считывающий время .mp3 и копирующий его в бефет обмена.
 
Необходим батник, который при запуске сканировал бы папку в которой он находится на mp3; вычислял их продолжительность, суммировал и скопировал их в буфет обмена в формате 00:00:00.

Iska 27-06-2012 22:01 1941676

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


Цитата:

Цитата 91892823
папку в которой он находится »

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

Foreigner 27-06-2012 22:20 1941688

Потребуется консольный 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 1941690

Iska, спасибо. Но я ничего не смыслю в vbscript`ах, как им хоть пользоваться?

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

Iska 27-06-2012 22:54 1941711

Цитата:

Цитата 91892823
как им хоть пользоваться? »

Сохранить код приведённого скрипта в файл с расширением «.vbs» (можно посредством Блокнота, указав кодировку ANSI при сохранении). Перетащить потребную папку на скрипт.

Цитата:

Цитата 91892823
консольный mediainfo? »

MediaInfo_CLI_0.7.58_Windows_i386.zip

91892823 27-06-2012 23:19 1941721

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

Foreigner 27-06-2012 23:44 1941732

Цитата:

чтобы консольная версия находилась в определенном месте, чтоб не копировать ее всюду?
Либо поместить в каталог, находящийся в %PATH%
Код:

set path
Либо в произвольный каталог, но прописать в батнике, например:
Код:

@echo off
setlocal enabledelayedexpansion

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

...

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

91892823 27-06-2012 23:54 1941736

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 1941743

Цитата:

Цитата 91892823
Но у меня почему-то он не совсем работает, выдает только "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 1941744

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 1941746

Если надо именно 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 1941749

Цитата:

Цитата Iska
(я раньше натыкался как-то на список свойств в разных ОС где-то на форуме KiXtart'а). »

Нашёл: GetExtFileProperties() - Get Extended File Properties / Attributes of Files - KiXtart.org - official site. В новых ОС это свойство зовётся «Length» вместо «Duration». Как в новых локализованных ОС — вместо «Длительность» — не знаю.

91892823 28-06-2012 00:12 1941750

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

Iska 28-06-2012 00:13 1941751

91892823, тогда ждём до утра.

Iska 28-06-2012 18:34 1942229

91892823, попробовал (на том, что есть).

1. По поводу именования столбцов в новых ОС:
Код:

Microsoft Windows Server 2008 R2 Standard  6.1.7600

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

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


Время: 09:13.

Время: 09:13.
© OSzone.net 2001-