it-swarm-pt.tech

Dividir comandos longos em várias linhas através do arquivo em lotes do Windows

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

637
Dan

Você pode quebrar linhas longas com o sinal de interpolação ^, desde que você se lembre de que o sinal de interceptação e a nova linha seguinte foram completamente removidos. Então, se deve haver 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
801
Wayne

A regra para o cursor é:

Um sinal de interpolação no final da linha, acrescenta a próxima linha, o primeiro caractere da linha anexada será ignorado.

Você pode usar o cursor várias vezes, mas a linha completa não deve exceder o comprimento máximo de linha de ~ 8192 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 tem que ser justo 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 inserir 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 a expansão atrasada, senão o restante da linha é ignorado após o avanço de linha.

Ele funciona, porque o cursor no final da linha ignora o próximo avanço de linha e escapa do próximo caractere, mesmo se o próximo caractere também for um avanço de linha (retornos de carro são sempre ignorados nessa fase).

240
jeb

(Isso é basicamente uma reescrita de resposta de Wayne mas com a confusão ao redor do cursor clarificada. Então eu postei isso como uma CW. Eu não sou tímido sobre edição respostas, mas reescrevê-los completamente parece inadequado.)

Você pode quebrar linhas longas com o sinal de interpolação (^), apenas lembre-se de que o cursor e a nova linha que o segue são removidos inteiramente do comando, então se você colocá-lo onde espaço seria necessário (como entre parâmetros), certifique-se de incluir o espaço também (seja antes do ^, ou no início da próxima linha - que a última opção pode ajudar a tornar mais claro que é uma continuação).

Exemplos: (todos testados no Windows XP e no Windows 7)

xcopy file1.txt file2.txt

pode ser escrito como:

xcopy^
 file1.txt^
 file2.txt

ou

xcopy ^
file1.txt ^
file2.txt

ou até mesmo

xc^
opy ^
file1.txt ^
file2.txt

(Esse último funciona porque não há espaços entre o xc e o ^ e nenhum espaço no início da próxima linha. Então, quando você remove o ^ e a nova linha, você obtém ...xcopy.)

Por questões de legibilidade e sanidade, é melhor quebrar apenas entre os parâmetros (certifique-se de incluir o espaço).

Tenha certeza de que o ^ é não a última coisa em um arquivo de lote, pois lá parece ser um grande problema com isso .

59
T.J. Crowder

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 carets (^) que as condicionais if gostavam que elas fossem seguidas apenas se houvesse um espaço presente:

if exist ^
14
Todd Partridge

No entanto, parece que a divisão no meio dos valores de um loop for não precisa de um cursor (e, na verdade, 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 após o hello ou antes do bye.

8
Mohammed Safwat