Come posso dividere comandi lunghi su più righe in un file batch?
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
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).
(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 .
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 ^
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.