Divida comandos longos em várias linhas por meio do arquivo em lote do Windows

StackOverflow https://stackoverflow.com/questions/69068

  •  09-06-2019
  •  | 
  •  

Pergunta

Como posso dividir comandos longos em várias linhas em um arquivo em lote?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top