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
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!
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. Tags command-line windows batch sox ms-dos