Adoro a ideia de usar forfiles
para fazer trabalhos em lote em arquivos, como o seguinte:
forfiles /m *.abc /c "cmd /c someprogram.exe -input @FILE -output @FNAME.xyz"
Exceto que isso não funciona porque forfiles insiste em colocar @FNAME
entre aspas, resultando no seguinte:
someprogram.exe -input "my file.abc" -output "my file".xyz
que é inválido e falha.
Como posso evitar @FNAME
ser envolto em aspas?
Minha solução hacky é ecoar o comando em vez de executá-lo, usar outro caractere (como *
) para marcar o início e o fim dos nomes dos arquivos e enviar a saída para um arquivo temporário:
forfiles /m *.abc /c "cmd /c echo someprogram.exe -input *@FILE* -output *@FNAME.xyz*" > go.bat
Em seguida, uso o powershell para remover tudo "
e substituir *
por "
.
powershell -Command (Get-Content go.bat) -replace '\"', '' -replace '\*', '\"' | Out-File -encoding ASCII go.bat
Após a primeira linha, go.bat
contém:
someprogram.exe -input *"my file.abc"* -output *"my file".xyz*
e após o powershell, go.bat
contém:
someprogram.exe -input "my file.abc" -output "my file.xyz"
que agora pode ser executado.
( Esta pergunta remove todas as aspas em toda a linha de comando, que quebra em arquivos e caminhos com espaços)
Forfiles não pode fazer isso. Pois no entanto pode.
Em seu arquivo de lote, você gostaria de usar o seguinte:
Este one-liner também pode ser usado diretamente no CMD, em caso afirmativo, use o seguinte: