Como posso dividir comandos longos em várias linhas em um arquivo em lotes?
batch-file
Ondra Žižka
fonte
fonte
^
e depois do texto do comando.echo
editado.co^␍py ^␍file1 ^␍file2
. Eu sugiro que você excluir seu comentário a confusão evitar, especialmente porque esta questyion é um tão popularA regra para o sinal de intercalação é:
Um sinal de intercalação no final da linha anexa a próxima linha; o primeiro caractere da linha anexada será escapado.
Você pode usar o sinal de intercalação várias vezes, mas a linha completa não deve exceder o comprimento máximo da linha de ~ 8192 caracteres (Windows XP, Windows Vista e Windows 7).
Para suprimir a fuga do próximo caractere, você pode usar um redirecionamento.
O redirecionamento deve ser logo antes do sinal de intercalação. Mas existe uma curiosidade com o redirecionamento antes do sinal de intercalação.
Se você colocar um token no cursor, ele será removido.
E também é possível incorporar feeds de linha na string:
A linha vazia é importante para o sucesso. Isso funciona apenas com expansão atrasada; caso contrário, o restante da linha é ignorado após o avanço da linha.
Funciona porque o cursor no final da linha ignora o próximo avanço de linha e escapa do próximo caractere, mesmo que o próximo caractere também seja um avanço de linha (os retornos de carro são sempre ignorados nesta fase).
fonte
copy ^[newline]"file1.txt" ^[newline]"file2.txt"
não funciona! Eu tive que adicionar um espaço:copy ^[newline] "file1.txt" ^[newline] "file2.txt"
.(Isso é basicamente uma reescrita da resposta de Wayne, mas com a confusão em torno do cursor resolvida. Então, eu a publiquei como CW. Não tenho vergonha de editar respostas, mas reescrevê-las completamente parece inadequado.)
Você pode dividir as linhas longas com o sinal de intercalação (
^
), lembre-se de que o sinal de intercalação e a nova linha a seguir são removidos inteiramente do comando; portanto, se você o colocar onde seria necessário um espaço (como entre parâmetros), verifique se para incluir também o espaço (antes da^
ou no início da próxima linha - essa última opção pode ajudar a deixar mais claro que é uma continuação).Exemplos: (todos testados no Windows XP e Windows 7)
pode ser escrito como:
ou
ou mesmo
(Esse último funciona porque não há espaços entre the
xc
e the^
, e não há espaços no início da próxima linha. Portanto, quando você remove a^
e a nova linha, obtém ...xcopy
).Para legibilidade e sanidade, provavelmente é melhor quebrar apenas entre parâmetros (não se esqueça de incluir o espaço).
Certifique-se de que não
^
seja a última coisa em um arquivo em lotes, pois parece haver um grande problema com isso .fonte
Vários comandos podem ser colocados entre parênteses e espalhados por várias linhas; então algo assim
echo hi && echo hello
pode ser colocado assim:Também variáveis podem ajudar:
Também notei com os sinais de intercalação (
^
) que osif
condicionais gostavam que eles seguissem apenas se um espaço estivesse presente:fonte
cmd1.bat && cmd2.bat
é diferente da forma parens: executecmd2.bat
se forcmd1.bat
executado com êxito (sem configuração%errorcode%
). O último formulário é executado incondicionalmente. Um tanto inesperado (pelo menos para mim) é que, obviamente, você não pode usar a combinação de ambos + ou seja, adicionar&&
antes da quebra de linha.( echo <line break here> hello )
resulta em uma linha vazia.Parece, no entanto, que a divisão no meio dos valores de um loop for não precisa de um sinal de intercalação (e, na verdade, tentar usar um será considerado um erro de sintaxe). Por exemplo,
Observe que nenhum espaço é necessário após o olá ou antes do tchau.
fonte
for
sintaxe: os separadores de elementos no "conjunto" são espaço, vírgula, ponto e vírgula, sinal de igual, caractere TAB e novas linhas.do
parte contiver váriasif-else
instruções / aninhadas ?