3

Я конвертирую музыку из проприетарного формата, который Nintendo 3DS использует в wav. Единственная программа, которая может преобразовать этот проприетарный формат, - это программа командной строки, которая принимает данные следующим образом:

convert.exe -o converted music.wav inputfile.differentformat

Я хочу знать, как я могу запустить эту программу для всех файлов в папке и сохранить исходные имена файлов. Например, если бы у меня было 3 файла с именами music1.differentformat, music2.differentformat и music3.differentformat, он запустил бы программу командной строки convert.exe и сгенерировал бы 3 wav-файла с именами music1.wav, music2.wav, music3.wav.

1 ответ1

1

Возможно, вы захотите попробовать 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 используется для запуска команд, хранящихся в виде строк. Это полезно для ситуаций, подобных вашей, когда нам нужно предварительно собрать аргументы для внешней команды, а затем выполнить эту команду с ее аргументами.

Поток скриптов

  1. Первые три строки устанавливают переменные, которые мы будем использовать позже для построения путей к файлам.
  2. Четвертая строка использует Get-ChildItem чтобы взять все файлы в $MusicFolder с расширением, совпадающим с $InputFormat , и направить их по конвейеру.
  3. В пятой строке ForEach-Object возьмет файлы, отправленные ему Get-ChildItem и запустит остальную часть блока сценария для каждого из них.
  4. Следующие три строки используются для дальнейшей детализации пути к файлу, который нам потребуется для предоставления правильных аргументов для convert.exe .
    • BaseName - это свойство файловых объектов, которое содержит только имя файла - исключая структуру папок и расширение файла.
    • Обратите внимание на экранированные двойные кавычки в $InputPath и $OutputPath . Это связано с тем, что фактические строковые значения будут заключены в двойные кавычки, поскольку утилита командной строки, подобная вашей, скорее всего, потребует их, чтобы правильно обрабатывать пути с пробелами или другими специальными символами.
  5. Последняя строка перед закрывающей скобкой собирает все вместе и запускает 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"
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .