Execute o lote SOX em arquivos em uma pasta relativa

1

Eu tenho um script em lotes do Windows que executa um comando SOX em vários arquivos, mas não sei como fazer com que o lote seja executado em arquivos em um caminho relativo ao do executável SOX. Atualmente todos os arquivos estão na raiz e são enviados para / combinados.

O script em lote:

cd %~dp0
mkdir combined
FOR %%A IN (*.mp3) DO sox static.mp3 %%A "combined/%%~nxA"
pause

Eu quero que o script execute o comando sox em arquivos no diretório "audiotracks" e envie-o para o diretório "combinado". Para ter uma ideia, essa seria a estrutura de pastas desejada:

/root
  sox.exe
  batch.bat
  static.mp3
     /audiotracks
       audio1.mp3
       audio2.mp3
       audio3.mp3
       audio4.mp3
     /combined
       audio1out.mp3
       audio2out.mp3
       audio3out.mp3
       audio4out.mp3

Isso é possível ou há um método melhor de fazer isso? Qualquer ajuda seria muito apreciada. Muito obrigado!

    
por Matteo Cuellar Vega 17.10.2012 / 18:11

2 respostas

1

Tente mudar primeiro para a diretoria. O alter o caminho salvar. (Dois pontos consecutivos significam a pasta pai.)

cd %~dp0
mkdir combined
cd audiotracks
FOR %%A IN (*.mp3) DO sox static.mp3 %%A "../combined/%%~nxA"
cd ..
pause
    
por 17.10.2012 / 18:36
0

Como na maioria das tarefas de programação, há mais de uma maneira de fazer o que você deseja. Sua implementação atual não está muito longe de uma solução de trabalho. O verdadeiro problema é que você está pensando sobre o problema do ângulo errado. Em vez de tentar processar os arquivos no diretório audiotracks relativo, você deve pensar em exibir os resultados no diretório combined relativo. Veja como seu script pode ser ajustado:

cd %~dp0
mkdir combined
cd audiotracks
FOR %%A IN (*.mp3) DO sox ..\static.mp3 "%%A" "..\combined\%%~nxA"
pause

Uma implementação alternativa e mais flexível pode ser usar o argumento /f do comando for . (Execute for /? para obter mais detalhes.) Isso permitirá que você use caminhos relativos para a entrada e a saída.

cd %~dp0
mkdir combined
FOR /f "tokens=*" %%A IN ('dir /b .\audiotracks\*.mp3') DO sox static.mp3 "%%A" ".\combined\%%~nxA"
pause

Vamos dividi-lo:

  • /f significa processar a saída do comando entre aspas simples (dentro dos parênteses) um token por vez.
  • "tokens=*" significa analisar uma linha inteira de saída como um único token. (Basicamente, isso significa que o espaço em branco não é considerado um delimitador).
  • 'dir /b .\audiotracks\*.mp3' significa listar todos os arquivos * .mp3 no diretório audiotracks sem data, tamanho ou outros metadados.
por 17.10.2012 / 18:51