Можливо, ви захочете спробувати 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"
}