Você pode querer experimentar o PowerShell para isso, em vez de usar o lote. O bom do PowerShell é que ele mantém o acesso a utilitários de linha de comando comuns, além de permitir que você aproveite as funções e comandos de script mais avançados que acompanham o PowerShell.
Dada a sua postagem original, acredito que a sintaxe de comando do seu utilitário convert seja algo assim.
convert.exe -o converted [output filename] [input filename]
Se esta sintaxe estiver incorreta, você precisará ajustar o script abaixo de acordo.
Modelo de script
$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"
}
Eu não testei muito dos itens acima , principalmente porque eu realmente não sei qual utilitário você está usando em primeiro lugar, mas deve funcionar em princípio. Aqui está a análise geral dos comandos e fluxo:
Conceitos básicos
- Qualquer coisa do formato
$[Name] = [Stuff]é uma atribuição de variável. -
Get-ChildItemé o equivalente do PowerShell adir. No entanto, como a maioria dos comandos do PowerShell,dirsimplesmente retorna strings para a saída do console, enquantoGet-ChildItemretorna objetos que possuem métodos e propriedades que podem ser usados quando os objetos são canalizados para outros comandos. - O caractere de canal (
|} redireciona a saída de um comando para outro comando para processamento adicional, em vez de simplesmente exibir os resultados no console. -
ForEach-Objectrecebe objetos em uma matriz e executa uma série de comandos em cada um deles. -
$_é uma variável incorporada que o PowerShell usa para se referir ao objeto atual que está sendo processado em um loop. -
$[Name].[Something]refere-se a uma propriedade ou método de uma variável - lembre-se, o PowerShell funciona principalmente com objetos em oposição a strings simples. -
'[Words and Stuff]'representa uma string básica estática. -
"[Words and Stuff]"também representa uma string. No entanto, aspas duplas são especiais porque dizem ao PowerShell para expandir as variáveis que estão dentro delas.-
$x = 'world'; Write-Output "Hello $x"produziráHello world. -
$x = 'world'; Write-Output 'Hello $x'produziráHello $x.
-
- O acento grave (
') é um caractere de escape, que diz ao PowerShell para incluir o caractere seguinte em uma string como em vez de processá-lo como um caractere especial, caso contrário teria um significado funcional na sintaxe do PowerShell. / li> -
Invoke-Expressioné usado para executar comandos armazenados como strings. Isso é útil para situações como a sua, em que precisamos pré-montar os argumentos para um comando externo e, em seguida, executar esse comando com seus argumentos.
Fluxo de script
- As três primeiras linhas definem variáveis que usaremos posteriormente para construir caminhos de arquivos.
- A quarta linha usa
Get-ChildItempara pegar todos os arquivos em$MusicFolder, com uma extensão correspondente a$InputFormate encaminhá-los ao longo do pipeline. - Na quinta linha,
ForEach-Objectpegará os arquivos enviados a ele porGet-ChildIteme executará o resto do bloco de script em relação a cada um deles. - As próximas três linhas são usadas para construir os detalhes do caminho do arquivo que precisaremos fornecer argumentos apropriados para
convert.exe.-
BaseNameé uma propriedade de objetos de arquivo que contém apenas o nome do arquivo - excluindo a estrutura de pastas e a extensão do arquivo. - Observe as aspas duplas de escape em
$InputPathe$OutputPath. Isso é para que os valores reais da string tenham aspas duplas em torno deles, já que um utilitário de linha de comando como o seu provavelmente irá requerê-los para processar corretamente os caminhos com espaços ou outros caracteres especiais neles.
-
- A última linha antes da chave de fechamento coloca tudo junto e executa
convert.execom os argumentos apropriados.
Exemplo de script
$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"
}