ЛС писал(а):Иногда возникает необходимость в декомпрессии lossless аудио-файлов в формат WAV. Конкретно речь идёт о FLAC, APE, ALAC: flac.exe, MAC.exe, alac.exe.
Я изучил параметры программ, и написал следующие юзер-команды (их выполнение приводит к созданию WAV-файла %P%O.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-файлов, они "сделаны" разными экзешниками.
То есть в батнике ветвление, некоторое, если формат такой-то - обрабатывать одним экзешнком, иной формат - другим.
Формат файла в данном случае определяется исключительно расширением.
'======================================================================
' Исполнение связанной программы в зависимости от расширения файла
' для каждого файла из файла-списка и для каждого вложенного файла
' для папок из файла-списка. Исполнение выполняется последовательно.
'
' Параметры:
' {файл-список}
'
' Пример параметров при вызове из 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 писал(а):мой скрипт, в отличие от приведённого выше батника, также обрабатывает каждый вложенный файл из выделенных папок
Весьма важное замечание (я скрипт не тестировал).
Batya писал(а):Для кого-то это может быть плюсом, для кого-то - минусом, но надо иметь в виду.
Лично для меня - плюс. В любом случае, положение дел (каким образом скрипт поступает с файлами в выделенных каталогах) оглашено.
Tol!k
А можно в батнике такое (как в скрипте Batya - обработка содержимого вложенных файлов из выделенных каталогов) осуществить? Если "да", то очень Вас прошу, пожалуйста.
Прекрасно, спасибо.
Раньше было так (батник не работал с каталогами; до декомпресии):
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
ЛС писал(а):У меня поменялись задачи. Теперь их две.
1. APE (только он, всегда) -> WAV
2. WAV (именно тот, который в предыдущем пункте) -> FLAC
<skip>
Теперь, что, собственно хотелось бы.
Автоматизировать.
Т. е.: один батник.
Выделили кучу каталогов, в которых много чего есть, но на данный момент только APE-файлы нас интересуют. Берём APE, преобразовываем в WAV, APE удаляется, WAV передается на сжатие во FLAC, удаляется WAV.