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,dir
simplesmente retorna strings para a saída do console, enquantoGet-ChildItem
retorna 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-Object
recebe 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-ChildItem
para pegar todos os arquivos em$MusicFolder
, com uma extensão correspondente a$InputFormat
e encaminhá-los ao longo do pipeline. - Na quinta linha,
ForEach-Object
pegará os arquivos enviados a ele porGet-ChildItem
e 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
$InputPath
e$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.exe
com 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"
}