Як пакетно конвертувати файли з командного рядка?


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

Можливо, ви захочете спробувати 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.
  • Серйозний акцент ( ` ) є втечним символом, який повідомляє 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"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.