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


735

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

Risposte:


919

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

95
È possibile iniziare la riga successiva senza spazio se si aggiunge uno spazio appena prima ^e dopo il testo del comando.
Joseph Daigle,

4
@SebaIllingworth - No, puoi sempre aggiungere [SPACE] + [^] e due righe vuote per creare un totale di 2 feed di riga quando viene modificato echo.
James K,

12
Per sicurezza termina sempre con una riga vuota quando si usano i punti di inserimento, vedere Carati semplici nel file batch consumano tutta la memoria
matt wilkie

4
@GavinMiller: "il cursore ^ dopo la copia e file1.txt su una nuova riga non funzionerà" Non è vero. Puoi dividere la linea ovunque, anche nel mezzo di una parola, come co^␍py ^␍file1 ^␍file2. Ti suggerisco di eliminare il tuo commento per evitare confusione, soprattutto perché questa questyion è così popolare
Borodin

3
Un gotcha qui è che ^ deve essere l'ultimo carattere sulla linea - cioè senza spazi dopo. Ho avuto problemi con questo e ho scoperto che avevo un sacco di spazi dopo il cursore, non facilmente visibili nell'editor che stavo usando.
GregHNZ,

267

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).


Il blocco di codice finale con l'esempio di avanzamento riga non visualizza la riga vuota, anche se è presente. (Almeno non compare in IE7) Prova invece a riformattare usando una blockquote.
dbenham,

5
La domanda è: dovremmo supportare uno strumento dannoso che non ha seguito le regole (qualcuno lo chiama browser, ma non lo è) o dovresti passare a un browser?
jeb

1
ho avuto virgolette doppie attorno ai miei valori, come nel set var = "testo qui ^" ma non funziona. Rimuovi la doppia citazione e va bene.
rjt

1
@jeb, ha scritto su un esempio in mancanza di script cmd, ma poi trovato questa domanda: stackoverflow.com/questions/4643376/...
rjt

Questo non funziona se la riga successiva inizia con le virgolette: copy ^[newline]"file1.txt" ^[newline]"file2.txt"non funziona! Ho dovuto aggiungere uno spazio: copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh,

70

(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 xce 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 .


18

I comandi multipli possono essere messi tra parentesi e distribuiti su numerose linee; quindi qualcosa del genere echo hi && echo hellopuò 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 ifcondizionali piaceva che seguissero solo se era presente uno spazio:

if exist ^

1
La linea cmd1.bat && cmd2.batè diversa dalla forma parentesi: esegue cmd2.batiff cmd1.bateseguito 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.
Paul Michalik,

( echo <line break here> hello )risulta in una riga vuota.
Karl Morrison,

risposta migliore e più pulita! i carets sono brutti e problematici in regex
neoscribe

9

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.


Naturalmente, questo fa parte della forsintassi: i separatori di elementi nel "for-set" sono spazio, virgola, punto e virgola, segno di uguale, carattere TAB e nuove righe.
Aacini,

Ma cosa succede se la doparte contiene if-elseistruzioni multiple / nidificate ?
Vicky Dev,

Quindi puoi semplicemente usare le parentesi per racchiudere le istruzioni come per% n in (ciao ciao) do (echo% n echo% n)
Mohammed Safwat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.