Обработка файлов в зависимости от расширения

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Моторокер, Avada, CaptainFlint, Nik, d-view

Ответить
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Обработка файлов в зависимости от расширения

Сообщение Tol!k »

ЛС писал(а):Иногда возникает необходимость в декомпрессии lossless аудио-файлов в формат WAV. Конкретно речь идёт о FLAC, APE, ALAC: flac.exe, MAC.exe, alac.exe.
Я изучил параметры программ, и написал следующие юзер-команды (их выполнение приводит к созданию WAV-файла %P%O.wav).

Код: Выделить всё

[em_FLAC->WAV] 
cmd=C:\Program Files\Tools\FLAC\flac.exe 
param=-d %P%N 
menu=Декомпрессия FLAC в WAV

Код: Выделить всё

[em_APE->WAV] 
cmd=C:\Program Files\Tools\MAC\MAC.exe 
param=%P%N "%P%O.wav" -d 
menu=Декомпрессия APE в WAV

Код: Выделить всё

[em_ALAC->WAV] 
cmd=C:\Program Files\Tools\ALAC\alac.exe 
menu=Декомпрессия ALAC в WAV 
param=-f "%P%O.wav" %P%N
Вышеприведённое работает лишь для одного файла, причём всегда необходимо смотреть на формат исходного файла.
Собственно, просьба в следующем: сделайте пожалуйста батник, который можно повесить на кнопку, и приписав оной некоторые параметры, уже НЕ задумываться о формате исходного lossless-файла.
То есть: выделили всё вперемешку (FLAC, APE, ALAC), нажали кнопку - получили кучу WAV-файлов, они "сделаны" разными экзешниками.
То есть в батнике ветвление, некоторое, если формат такой-то - обрабатывать одним экзешнком, иной формат - другим.
Формат файла в данном случае определяется исключительно расширением.

Код: Выделить всё

@echo off &setlocal enableextensions &chcp 1251 >nul
rem Обработка файлов в зависимости от расширения
rem Параметры: "%L"
rem Автор: Tol!k
for /f "usebackq delims=" %%s in ("%~1") do (
  for /f "delims=" %%f in ('dir /b/s/a-d/o-n "%%s"') do (
    title "%%f" &echo "%%f"
    if not "%%~xf"=="" call :%%~xf "%%f"
    echo -------------------------------------------------------------------------------
  )
)
title Done. &pause
goto :eof

:.FLAC
rem Decoding: flac -d [<general-options>] [<format-options>] [FLACFILE [...]]
"C:\Program Files\Tools\FLAC\flac.exe" -d -f %1
goto :eof

:.APE
rem Decompress: mac.exe "Metallica - One.ape" "Metallica - One.wav" -d
"C:\Program Files\Tools\MAC\MAC.exe" %1 "%~dpn1.wav" -d
goto :eof

:.M4A
rem Usage: alac [options] [--] file
"C:\Program Files\Tools\ALAC\alac.exe" -f "%~dpn1.wav" %1
goto :eof
*.alac не проверял

Add:
campoviy писал(а):> Не удается найти указанную метку пакетного файла - .m4a

Решил проблему заменой строки ":.ALAC" на ":.M4A"; соответственно, поправьте пожалуйста пост.
OK
Последний раз редактировалось Tol!k Пн май 30, 2011 22:18, всего редактировалось 2 раза.
Аватара пользователя
campoviy
Сообщения: 109
Зарегистрирован: Сб дек 18, 2010 17:49
Откуда: Russian Federation, Krasnodar region

Сообщение campoviy »

Tol!k
Большое спасибо, это именно то, что нужно! :)
*.alac не проверял
Apple Lossless decoders: Generic Win32 compile; P4 Win32 compile.
А вот, версия (тоже без зависимостей), скопилированная в Visual Studio 2010, из актуальных исходников.
Взялся проверить, наткнулся на:
Не удается найти указанную метку пакетного файла - .m4a
-------------------------------------------------------------------------------

Для продолжения нажмите любую клавишу . . .
Решил проблему заменой строки ":.ALAC" на ":.M4A"; соответственно, поправьте пожалуйста пост.

Однако, для любителей VBS-скриптов могу предложить такой вариант, автор - Batya:

Код: Выделить всё

'====================================================================== 
' Исполнение связанной программы в зависимости от расширения файла 
'   для каждого файла из файла-списка и для каждого вложенного файла 
'   для папок из файла-списка. Исполнение выполняется последовательно. 
' 
' Параметры: 
' {файл-список} 
' 
' Пример параметров при вызове из TC: 
' %L 
'====================================================================== 
Option Explicit 
Dim FSO, WSH, FF, F 

With WScript 
  If .Arguments.Count = 0 Then 
    MsgBox "Не заданы параметры!", vbOKOnly + vbCritical, "Исполнение связанных программ" 
    .Quit 
  End If 
  FF = .Arguments(0) 
End With 

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set WSH = CreateObject("WScript.Shell") 

With FSO.OpenTextFile(FF, 1) 
  Do While Not .AtEndOfStream 
    F = Trim(.ReadLine) 
    If F <> "" Then 
      If FSO.FolderExists(F) Then ForFolder FSO.GetFolder(F) 
      If FSO.FileExists(F)   Then WSH.Run CommandLine(FSO.GetFile(F)), 1, True 
    End If 
  Loop 
  .Close 
End With 

Set FSO = Nothing 
Set WSH = Nothing 
WScript.Quit 

Sub ForFolder(pFolder) 
  Dim lF 
  For Each lF In pFolder.Files 
    WSH.Run CommandLine(lF), 1, True 
  Next 
  For Each lF In pFolder.SubFolders 
    ForFolder lF 
  Next 
End Sub 

Function CommandLine(pFile) 
  Dim lPath, lName, lExt 
  lPath = pFile.ParentFolder.Path 
  lName = FSO.GetBaseName(pFile) 
  lExt  = UCase(FSO.GetExtensionName(pFile)) 
  Select Case lExt 
    Case "FLAC" 
      CommandLine = """C:\Program Files\Tools\FLAC\flac.exe"" -d """ & pFile & """" 
    Case "APE" 
      CommandLine = """C:\Program Files\Tools\MAC\MAC.exe"" """ & pFile & """ """ & lPath & "\" & lName & ".wav"" -d" 
    Case "M4A" 
      CommandLine = """C:\Program Files\Tools\ALAC\alac.exe"" -f """ & lPath & "\" & lName & ".wav"" """ & pFile & """" 
  End Select 
End Function
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Замечу, что мой скрипт, в отличие от приведённого выше батника, также обрабатывает каждый вложенный файл из выделенных папок.
Для кого-то это может быть плюсом, для кого-то - минусом, но надо иметь в виду.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
campoviy
Сообщения: 109
Зарегистрирован: Сб дек 18, 2010 17:49
Откуда: Russian Federation, Krasnodar region

Сообщение campoviy »

Batya
Batya писал(а):мой скрипт, в отличие от приведённого выше батника, также обрабатывает каждый вложенный файл из выделенных папок
Весьма важное замечание (я скрипт не тестировал).
Batya писал(а):Для кого-то это может быть плюсом, для кого-то - минусом, но надо иметь в виду.
Лично для меня - плюс. В любом случае, положение дел (каким образом скрипт поступает с файлами в выделенных каталогах) оглашено.

Tol!k
А можно в батнике такое (как в скрипте Batya - обработка содержимого вложенных файлов из выделенных каталогов) осуществить? Если "да", то очень Вас прошу, пожалуйста.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Сделано.

+ В конце файла можно добавить

Код: Выделить всё

:.CUE
:.DOC
:.JPG
:.LOG
:.M3U
:.PDF
:.TXT
rem Это заглушка
goto :eof
Аватара пользователя
campoviy
Сообщения: 109
Зарегистрирован: Сб дек 18, 2010 17:49
Откуда: Russian Federation, Krasnodar region

Сообщение campoviy »

Tol!k
Tol!k писал(а):Сделано.
Прекрасно, спасибо. :)
Раньше было так (батник не работал с каталогами; до декомпресии):
D:\Docs\TEMP\(01) [Sandra] Japan ist weit.ape
D:\Docs\TEMP\(05) [Laserdance] Future Generation.flac
D:\Docs\TEMP\08 One In A Million.m4a
И после декомпресии:
D:\Docs\TEMP\(01) [Sandra] Japan ist weit.wav
D:\Docs\TEMP\(05) [Laserdance] Future Generation.wav
D:\Docs\TEMP\08 One In A Million.wav
Теперь, взялся проверить в работу с вложенными файлам, в таком случае (соответственно, выделяя каталоги Laserdance, Modern Talking, Sandra, в коих необходимые файлы и лежат):
D:\Docs\TEMP\Laserdance\(05) [Laserdance] Future Generation.flac
D:\Docs\TEMP\Modern Talking\08 One In A Million.m4a
D:\Docs\TEMP\Sandra\(01) [Sandra] Japan ist weit.ape
Получил:
D:\Docs\TEMP\Laserdance\(05) [Laserdance] Future Generation.wav
D:\Docs\TEMP\Modern Talking\08 One In A Million.wav
D:\Docs\TEMP\Sandra\(01) [Sandra] Japan ist weit.wav
Следовательно, батник работает правильно. :)
И ещё, господа, раз я в первом посте уже выложил экзешник без зависимостей, "используемый батником", то завершу начатое.
FLAC v.1.2.1b bundle: MSVC8 Compile; ICL11.1.046 compile.
Соответствующего поведения MAC.exe берётся с офсайта: Latest Version - 4.10.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

ЛС писал(а):У меня поменялись задачи. Теперь их две.
1. APE (только он, всегда) -> WAV
2. WAV (именно тот, который в предыдущем пункте) -> FLAC
<skip>
Теперь, что, собственно хотелось бы.
Автоматизировать.
Т. е.: один батник.
Выделили кучу каталогов, в которых много чего есть, но на данный момент только APE-файлы нас интересуют. Берём APE, преобразовываем в WAV, APE удаляется, WAV передается на сжатие во FLAC, удаляется WAV.

Код: Выделить всё

@echo off &setlocal enableextensions &chcp 1251 >nul
rem Параметры: "%L"
for /f "usebackq delims=" %%s in ("%~1") do (
  for /f "delims=" %%f in ('dir /b/s/a-d/o-n "%%s"') do (
    title "%%f"
    if /i "%%~xf"==".APE" call :.APE2FLAC "%%f" &echo -------------------------------------------------------------------------------
  )
)
title Done. &pause
goto :eof

:.APE2FLAC == Перекодирование .APE в .FLAC
"C:\Program Files\Tools\MAC\MAC.exe" %1 - -d >"%temp%\~ape2flac.wav" &&"C:\Program Files\Tools\FLAC\flac.exe" -8 -f -o "%~dpn1.flac" "%temp%\~ape2flac.wav" &&del /q %1 "%temp%\~ape2flac.wav"
goto :eof
Ответить