Divida comandos longos em várias linhas por meio do arquivo em lote do Windows
-
09-06-2019 - |
Pergunta
Como posso dividir comandos longos em várias linhas em um arquivo em lote?
Solução
Você pode quebrar linhas longas com o cursor ^
contanto que você lembre que o cursor e a nova linha que o segue foram completamente removidos.Portanto, se houver um espaço onde você está quebrando a linha, inclua um espaço. (Mais sobre isso abaixo.)
Exemplo:
copy file1.txt file2.txt
seria escrito como:
copy file1.txt^
file2.txt
Outras dicas
A regra para o cursor é:
Um acento circunflexo no final da linha anexa a próxima linha, o primeiro caractere da linha anexada será escapado.
Você pode usar o cursor várias vezes, mas a linha completa não deve exceder o comprimento máximo da linha de aproximadamente 8.192 caracteres (Windows XP, Windows Vista e Windows 7).
echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*
echo Test2
echo one & echo two
--- Output ---
Test2
one
two
echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two
echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two
Para suprimir o escape do próximo caractere você pode usar um redirecionamento.
O redirecionamento deve ocorrer logo antes do cursor.Mas existe uma curiosidade com o redirecionamento antes do cursor.
Se você colocar um token no cursor, o token será removido.
echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two
echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two
E também é possível incorporar feeds de linha na string:
setlocal EnableDelayedExpansion
set text=This creates ^
a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed
A linha vazia é importante para o sucesso.Isso funciona apenas com expansão atrasada; caso contrário, o restante da linha será ignorado após a alimentaçã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).
(Esta é basicamente uma reescrita de A resposta de Wayne mas com a confusão em torno do cursor esclarecida.Então eu postei como um CW.Não tenho vergonha de editar respostas, mas reescrevendo-os completamente parece inapropriado.)
Você pode quebrar linhas longas com o cursor (^
), lembre-se de que o cursor e a nova linha que o segue são removidos inteiramente do comando, portanto, se você colocá-lo onde um espaço seria necessário (como entre parâmetros), certifique-se de incluir o espaço também (antes do ^
, ou no início da próxima linha — essa última opção pode ajudar a deixar mais claro que se trata de uma continuação).
Exemplos: (todos testados no Windows XP e Windows 7)
xcopy file1.txt file2.txt
pode ser escrito como:
xcopy^
file1.txt^
file2.txt
ou
xcopy ^
file1.txt ^
file2.txt
ou mesmo
xc^
opy ^
file1.txt ^
file2.txt
(Este último funciona porque não há espaços entre os xc
e a ^
, e sem espaços no início da próxima linha.Então, quando você remove o ^
e a nova linha, você obtém ...xcopy
.)
Para facilitar a leitura e a sanidade, provavelmente é melhor quebrar apenas entre os parâmetros (certifique-se de incluir o espaço).
Certifique-se de que o ^
é não a última coisa em um arquivo em lote, pois há parece ser um grande problema com isso.
Vários comandos podem ser colocados entre parênteses e espalhados por várias linhas;então algo como echo hi && echo hello
pode ser colocado assim:
( echo hi
echo hello )
Também variáveis podem ajudar:
set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...
Também notei com sinais de intercalação (^
) que o if
condicionais gostariam que eles seguissem apenas se um espaço estivesse presente:
if exist ^
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 realmente tentar usar um será considerado um erro de sintaxe).Por exemplo,
for %n in (hello
bye) do echo %n
Observe que nenhum espaço é necessário depois do olá ou antes do tchau.