Come posso dividere i comandi lunghi su più righe in un file batch?
Come posso dividere i comandi lunghi su più righe in un file batch?
Risposte:
Puoi spezzare le lunghe file con il cursore ^
finché ti ricordi che il cursore e la nuova riga che lo seguono vengono completamente rimossi. Quindi, se ci dovrebbe essere uno spazio in cui stai rompendo la linea, includi uno spazio. ( Altre informazioni al riguardo. )
Esempio:
copy file1.txt file2.txt
sarebbe scritto come:
copy file1.txt^
file2.txt
echo
.
co^␍py ^␍file1 ^␍file2
. Ti suggerisco di eliminare il tuo commento per evitare confusione, soprattutto perché questa questyion è così popolare
La regola per il cursore è:
Un cursore alla fine della riga, aggiunge la riga successiva, il primo carattere della riga aggiunta verrà evitato.
È possibile utilizzare il punto di inserimento più volte, ma la riga completa non deve superare la lunghezza massima della riga 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 la fuga del personaggio successivo puoi usare un reindirizzamento.
Il reindirizzamento deve essere appena prima del cursore. Ma esiste una curiosità con il reindirizzamento davanti al guardiano.
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 espansione ritardata, altrimenti il resto della riga viene ignorato dopo l'avanzamento della riga.
Funziona perché il punto di inserimento alla fine della riga ignora l'avanzamento di riga successivo e sfugge al carattere successivo, anche se il carattere successivo è anche un avanzamento di riga (i ritorni a capo vengono sempre ignorati in questa fase).
copy ^[newline]"file1.txt" ^[newline]"file2.txt"
non funziona! Ho dovuto aggiungere uno spazio: copy ^[newline] "file1.txt" ^[newline] "file2.txt"
.
(Questa è fondamentalmente una riscrittura della risposta di Wayne ma con la confusione attorno al punto di inserimento chiarita. Quindi l'ho pubblicato come CW. Non sono timido nel modificare le risposte, ma riscriverle completamente sembra inappropriato.)
Puoi spezzare le lunghe file con il punto di inserimento ( ^
), ricorda solo che il punto di inserimento e la riga successiva che lo seguono vengono rimossi completamente dal comando, quindi se lo metti dove sarebbe richiesto uno spazio (come tra i parametri), assicurati per includere anche lo spazio (prima del^
o all'inizio della riga successiva - quest'ultima scelta può aiutare a chiarire che è 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 il xc
e il ^
, e non ci sono spazi all'inizio della riga successiva. Quindi quando rimuovi il ^
e il newline, ottieni .... xcopy
)
Per leggibilità e sanità mentale, probabilmente è meglio interrompere solo tra i parametri (assicurarsi di includere lo spazio).
Assicurarsi che il ^
è non è l'ultima cosa che in un file batch, come ci sembra essere un grosso problema con questo .
I comandi multipli possono essere messi tra parentesi e distribuiti su numerose linee; quindi qualcosa del genere 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 carets ( ^
) che ai if
condizionali piaceva che seguissero solo se era presente uno spazio:
if exist ^
cmd1.bat && cmd2.bat
è diversa dalla forma parentesi: esegue cmd2.bat
iff cmd1.bat
eseguito correttamente (-senza impostazione %errorcode%
). Quest'ultima forma viene eseguita incondizionatamente. Un po 'inaspettato (almeno per me) è che, ovviamente, non puoi usare la combinazione di entrambi + cioè aggiungere &&
prima dell'interruzione di riga.
( echo <line break here> hello )
risulta in una riga vuota.
Sembra tuttavia che la suddivisione nel mezzo dei valori di un ciclo for non abbia bisogno di un cursore (e in realtà provare a usarne uno sarà considerato un errore di sintassi). Per esempio,
for %n in (hello
bye) do echo %n
Nota che non è nemmeno necessario spazio dopo ciao o prima di ciao.
for
sintassi: i separatori di elementi nel "for-set" sono spazio, virgola, punto e virgola, segno di uguale, carattere TAB e nuove righe.
do
parte contiene if-else
istruzioni multiple / nidificate ?
^
e dopo il testo del comando.