Возможно, вы захотите попробовать PowerShell для этого, а не пакетный. Приятной особенностью PowerShell является то, что он сохраняет доступ к обычным служебным программам командной строки, а также позволяет использовать более продвинутые функции сценариев и команды, которые поставляются с PowerShell.
Учитывая ваш оригинальный пост, я предполагаю, что синтаксис команды для вашей утилиты конвертирования выглядит примерно так.
convert.exe -o converted [output filename] [input filename]
Если этот синтаксис неправильный, вам необходимо соответствующим образом настроить приведенный ниже скрипт.
Шаблон скрипта
$MusicFolder = '[Full path to music folder]'
$InputFormat = '[Extension for input files]'
$OutputFormat = '[Extension for output files]'
Get-ChildItem "$MusicFolder\*.$InputFormat" |
ForEach-Object {
$Filename = $_.BaseName
$InputPath = "`"$MusicFolder\$Filename.$InputFormat`""
$OutputPath = "`"$MusicFolder\$Filename.$OutputFormat`""
Invoke-Expression "convert.exe -o converted $OutputPath $InputPath"
}
Я не тестировал многое из вышеперечисленного, в первую очередь потому, что не знаю, какую утилиту вы используете в первую очередь, но в принципе она должна работать. Вот общая разбивка команд и потоков:
Основные понятия
- Все, что имеет формат
$[Name] = [Stuff]
является присваиванием переменной.
Get-ChildItem
является эквивалентом PowerShell для dir
. Однако ключевое отличие, как и в большинстве команд PowerShell, заключается в том, что dir
просто возвращает строки для вывода на консоль, тогда как Get-ChildItem
фактически возвращает объекты, которые имеют методы и свойства, которые можно использовать, когда объекты передаются другим командам.
- Символ канала (
|
} перенаправляет вывод из одной команды в другую команду для дальнейшей обработки вместо простого отображения результатов на консоли.
ForEach-Object
берет объекты в массив и запускает серию команд для каждого из них.
$_
- это встроенная переменная, которую PowerShell использует для ссылки на текущий объект, обрабатываемый в цикле.
$[Name].[Something]
ссылается на свойство или метод переменной - помните, PowerShell работает в основном с объектами, а не с простыми строками.
'[Words and Stuff]'
представляет собой базовую статическую строку.
"[Words and Stuff]"
также представляет строку. Однако двойные кавычки являются особыми, потому что они говорят PowerShell расширять переменные, которые находятся внутри них.
$x = 'world'; Write-Output "Hello $x"
выведет Hello world
.
$x = 'world'; Write-Output 'Hello $x'
выведет Hello $x
.
- Могильный акцент (
`
) является escape-символом, который говорит PowerShell включить следующий символ в строку как есть, а не обрабатывать его как специальный символ, если в противном случае он имел бы функциональное значение в синтаксисе PowerShell.
Invoke-Expression
используется для запуска команд, хранящихся в виде строк. Это полезно для ситуаций, подобных вашей, когда нам нужно предварительно собрать аргументы для внешней команды, а затем выполнить эту команду с ее аргументами.
Поток скриптов
- Первые три строки устанавливают переменные, которые мы будем использовать позже для построения путей к файлам.
- Четвертая строка использует
Get-ChildItem
чтобы взять все файлы в $MusicFolder
с расширением, совпадающим с $InputFormat
, и направить их по конвейеру.
- В пятой строке
ForEach-Object
возьмет файлы, отправленные ему Get-ChildItem
и запустит остальную часть блока сценария для каждого из них.
- Следующие три строки используются для дальнейшей детализации пути к файлу, который нам потребуется для предоставления правильных аргументов для
convert.exe
.
BaseName
- это свойство файловых объектов, которое содержит только имя файла - исключая структуру папок и расширение файла.
- Обратите внимание на экранированные двойные кавычки в
$InputPath
и $OutputPath
. Это связано с тем, что фактические строковые значения будут заключены в двойные кавычки, поскольку утилита командной строки, подобная вашей, скорее всего, потребует их, чтобы правильно обрабатывать пути с пробелами или другими специальными символами.
- Последняя строка перед закрывающей скобкой собирает все вместе и запускает
convert.exe
с соответствующими аргументами.
Пример скрипта
$MusicFolder = 'C:\Users\Me\My Documents\Music'
$InputFormat = 'mp3'
$OutputFormat = 'wav'
Get-ChildItem "$MusicFolder\*.$InputFormat" |
ForEach-Object {
$Filename = $_.BaseName
$InputPath = "`"$MusicFolder\$Filename.$InputFormat`""
$OutputPath = "`"$MusicFolder\$Filename.$OutputFormat`""
Invoke-Expression "convert.exe -o converted $OutputPath $InputPath"
}