Como converter arquivos em lote a partir da linha de comando?

3

Estou convertendo músicas de um formato proprietário que o Nintendo 3DS usa para wav. O único programa que pode converter esse formato proprietário é um programa de linha de comando que recebe entradas assim:

convert.exe -o converted music.wav inputfile.differentformat

Eu quero saber como posso executar este programa para todos os arquivos em uma pasta e manter os nomes dos arquivos originais. Por exemplo, se eu tivesse 3 arquivos chamados music1.differentformat, music2.differentformat e music3.differentformat , ele executaria o programa de linha de comando chamado convert.exe e gere 3 arquivos wav chamados music1.wav, music2.wav, music3.wav .

    
por Mike 16.10.2014 / 06:37

1 resposta

1

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 a dir . No entanto, como a maioria dos comandos do PowerShell, dir simplesmente retorna strings para a saída do console, enquanto Get-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

  1. As três primeiras linhas definem variáveis que usaremos posteriormente para construir caminhos de arquivos.
  2. 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.
  3. Na quinta linha, ForEach-Object pegará os arquivos enviados a ele por Get-ChildItem e executará o resto do bloco de script em relação a cada um deles.
  4. 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.
  5. 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"
}
    
por 16.10.2014 / 07:58

Tags