Можливо, ви захочете спробувати 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 використовується для виконання команд, що зберігаються як рядки. Це корисно для таких ситуацій, як ваша, де нам необхідно попередньо зібрати аргументи для зовнішньої команди, а потім виконати цю команду з її аргументами.
Потік сценарію
- Перші три рядки задають змінні, які ми будемо використовувати пізніше для побудови шляхів до файлів.
- Четверта лінія використовує
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"
}