it-swarm-eu.dev

Dividere i comandi lunghi su più righe tramite il file batch di Windows

Come posso dividere comandi lunghi su più righe in un file batch?

634
Dan

Puoi spezzare le linee lunghe con il carattere ^ a condizione che ti ricordi che il segno di omissione e la nuova riga che segue sono completamente rimossi. Quindi, se ci dovrebbe essere uno spazio in cui stai rompendo la linea, includi uno spazio. ( Altro su quello sotto. )

Esempio:

copy file1.txt file2.txt

sarebbe scritto come:

copy file1.txt^
 file2.txt
795
Wayne

La regola per il segno di omissione è:

Un segno di omissione alla fine della riga, aggiunge la riga successiva, il primo carattere della riga aggiunta verrà sfuggito.

È possibile utilizzare il punto di inserimento più volte, ma la riga completa non deve superare la lunghezza massima della linea di ~ 8192 caratteri (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

Per sopprimere l'escape del prossimo carattere puoi usare un reindirizzamento.

Il reindirizzamento deve essere appena prima del cursore. Ma esiste una curiosità con il reindirizzamento prima del cursore.

Se si posiziona un token sul punto di inserimento, il token viene rimosso.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

Ed è anche possibile incorporare feed di riga nella stringa:

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

La linea vuota è importante per il successo. Funziona solo con un'espansione ritardata, altrimenti il ​​resto della linea viene ignorato dopo l'avanzamento della riga.

Funziona, perché il segno di omissione alla fine della linea ignora il successivo avanzamento riga e sfugge al carattere successivo, anche se il carattere successivo è anche un avanzamento riga (i ritorni a capo vengono sempre ignorati in questa fase).

239
jeb

(Questo è fondamentalmente una riscrittura di La risposta di Wayne ma con la confusione attorno al cursore accennato. Quindi l'ho postato come CW. Non sono timido nel modificare le risposte, ma completamente riscrivendoli sembra inappropriato.)

Puoi spezzare le linee lunghe con il segno di omissione (^), ricorda solo che il segno di omissione e la nuova riga che segue vengono rimossi completamente dal comando, quindi se lo metti dove sarebbe richiesto uno spazio (tale come tra i parametri), assicurati di includere anche lo spazio (prima del ^, o all'inizio della riga successiva - quest'ultima scelta può aiutare a renderla più chiara è una continuazione).

Esempi: (tutti testati su Windows XP e Windows 7)

xcopy file1.txt file2.txt

può essere scritto come:

xcopy^
 file1.txt^
 file2.txt

o

xcopy ^
file1.txt ^
file2.txt

o anche

xc^
opy ^
file1.txt ^
file2.txt

(Quest'ultimo funziona perché non ci sono spazi tra xc e ^, e nessuno spazio all'inizio della riga successiva, quindi quando rimuovi ^ e newline, ottieni ...xcopy.)

Per la leggibilità e la sanità mentale, è probabilmente meglio interrompere solo tra i parametri (assicurati di includere lo spazio).

Assicurati che ^ sia not l'ultima cosa in un file batch, dato che lì sembra essere un grosso problema con quello .

59
T.J. Crowder

I comandi multipli possono essere messi tra parentesi e sparsi su numerose linee; quindi qualcosa come echo hi && echo hello può essere messo così:

( echo hi
  echo hello )

Anche le variabili possono aiutare:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

Inoltre ho notato con i caret (^) che ai condizionali if piacevano seguire solo se era presente uno spazio:

if exist ^
13
Todd Partridge

Sembra comunque che la suddivisione in mezzo ai valori di un ciclo for non abbia bisogno di un segno di omissione (e in realtà il tentativo di usarne uno sarà considerato un errore di sintassi). Per esempio,

for %n in (hello
bye) do echo %n

Si noti che nessuno spazio è nemmeno necessario dopo ciao o prima ciao.

8
Mohammed Safwat