q "echo test" "log.txt"
estaria alimentando dois parâmetros.
"echo test" seria por si só, e não é mais "Echo" seguido de "test" como um argumento para Echo, mas sim um único comando chamado "echo test", que é inválido.
Você precisa separar os argumentos dos comandos, e realmente o script em lote NÃO é a melhor maneira de fazer isso, especialmente se você quiser uma quantidade dinâmica de argumentos. Olhe para o uso do PowerShell.
Dito isto, se você quer algo simples, não tão flexível, e ainda é um arquivo de lote, então tente o seguinte no seu arquivo de lote:
%2 %3 > %1
.
Em seguida, basta especificar o arquivo de saída primeiro, seguido pelo comando, seguido pelo argumento que você deseja usar com esse comando.
I.E .: q log.txt echo Test
ou q log.txt echo "string with spaces to echo"
.
Isso funciona para mim. :)