Come posso eco una nuova riga in un file batch?


642

Come è possibile inserire una nuova riga dall'output del file batch?

Voglio fare qualcosa del tipo:

echo hello\nworld

Che produrrebbe:

hello
world

6
È venuto utile per me. Ho dovuto fare eco \ n \ n | my_app.exe in uno script. Ho fatto (echo. && echo.) | my_app.exe
Vignesh,

2
Approccio semplice "Il codice inizia:"> ciao eco e mondo eco, ti darà ciò di cui
hai

1
È possibile inserire un ascii chr invisibile (255) su una riga separata che forzerà una nuova riga vuota. Tenere premuto il tasto [alt] e premere 255 sulla tastiera. questo inserisce chr (255) che è un quadrato vuoto. vale a dire " echo (alt + 255) " Puoi usare solo la tastiera, non i numeri nella parte superiore della tastiera querty!
jwzumwalt,

Proprio come metà della riparazione del computer lo sta collegando e accendendo, metà dello sviluppo del software è ciò che chiamo ingegneria spaziale . Abbiamo bisogno delle nostre righe vuote proprio così.
Bob Stein,

Cosa ne pensi di questo ? echo Yes&echo No
scientist_7,

Risposte:


462

echo hello & echo.world

Ciò significa che potresti definire & echo.una costante per una nuova riga \n.


43
l'esempio non ha bisogno di un punto, ma ne hai bisogno per riecheggiare una riga vuota vuota:echo. && echo hello && echo. && echo world
matt wilkie

4
Puoi farlo con un singolo eco in modo che possa essere reindirizzato a un file?
Shahbaz,

46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB,

25
La cosa del periodo in "eco". non smette mai di stupirmi. È così datato, eppure dimentico sempre che il punto deve essere strettamente concatenato con il nome del comando, senza spazi tra. Non ci sono errori nel tuo post, sto scrivendo questo solo come promemoria: "eco". ! = "echo." !
quetzalcoatl,

5
@quetzalcoatl, diventa ancora più strano. Anche altri personaggi oltre al punto funzionano. SS64 afferma che la sintassi migliore èecho( per prestazioni migliori (ancora senza spazio per te). Discussione estesa di altri personaggi e dei loro meriti / difetti in ECHO. ERRORI per dare testo o riga vuota - Usa invece ECHO /
matt wilkie

558

Uso:

echo hello
echo.
echo world

16
È possibile fornire una stringa all'interno di una singola istruzione echo?
Brian R. Bondy,

5
Perché hai bisogno di farlo con una singola istruzione echo; dov'è il danno nel averne un altro?
Rob,

3
@Rob, ho appena riscontrato questo problema e nessuno di questi funziona. Devi echeggiare in una singola affermazione nel mio esempio. Sto generando alcuni file tex da HTML e generando un Makefile usando echo "Makefile contents (which has \n)" > MakefileCon più echi, non funzionerebbe
Shahbaz,

3
Usa & (o &&) per eseguirli in una singola istruzione: ad esempio, per inserire "ciao \ nworld" in un file txt:(echo hello & echo world) >> ./test.txt
Ned Martin

4
Per l'output su più righe in un file, perché non fare semplicemente quanto segue? echo line 1 > Makefilee poi echo line 2 >> Makefile. L'uso di >>provoca l'aggiunta dell'output al file, che è esattamente il comportamento necessario per questo caso.
Dgnuff

141

Ecco fatto, crea un file .bat con al suo interno:

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

Dovresti vedere un output simile al seguente:

There should be a newline
inserted here.

Press any key to continue . . .

È necessario solo il codice tra le istruzioni REM, ovviamente.


51
Molto impressionante, potresti dedicare del tempo per spiegare come funziona la linea impostata NL = ^^^% NLM %% NLM% ^% NLM %% NLM%? Non riesco proprio a pensarci bene
Andy Morris,

8
methinks @andy a +8 commento warrant una domanda: stackoverflow.com/questions/6379619/...
Wilkie opaco

82
Questo è un meraviglioso esempio per dimostrare che i file batch cmd.exe e Windows sono completamente pazzi!
mivk,

12
NOTA PER SÉ: la riga "set NLM = ^" non deve contenere nulla dopo CARET e deve contenere 2 righe vuote dopo di essa.
mnemotronic,

4
Vedi la mia risposta per un metodo più semplice. set nl=^&echo., quindi echo hello %nl% worldproduce solo lo stesso effetto.
coltonon,

96

Esiste una funzione standard echo:nei file cmd / bat per scrivere una riga vuota, che emula una nuova riga nell'output cmd:

@echo off
@echo line1
@echo:
@echo line2

Output del file cmd sopra citato:

line1

line2

37
In effetti, qualsiasi carattere speciale NON UTILIZZATO dovrebbe funzionare. Incoraggio sempre l'uso di / perché la barra è il carattere standard per le opzioni di comando. Inoltre, critico sempre l'uso del punto che qualcuno in Microsoft sfortunatamente sceglie perché il comando: echo.com fornisce risultati diversi a seconda della versione del processore di comandi MS-DOS / Windows Batch.
Aacini,

21
L'unica versione che funziona sempre è echo(. Sembra che potrebbe causare problemi, ma in realtà funziona perfettamente. Tutte le altre forme presentano almeno una situazione in cui il comando non funzionerà come desiderato.
dbenham,

5
@naxa - Niente di ufficiale, solo conoscenze collettive derivate da alcuni hacker batch. L'obiettivo è avere una sintassi che può essere utilizzata per ECHO qualsiasi valore, incluso nulla, e non doversi mai preoccupare di ottenere qualcosa di diverso da quello che ci si aspetta. Il miglior sommario che conosco è su dostips.com/forum/viewtopic.php?p=4554#p4554 . Ti lascia in sospeso, ma nessuno ha mai escogitato uno scenario in cui ECHO(fallisce.
dbenham,

2
@Pacerier: ci sono esempi di errori per ciascuno di questi suggerimenti. Leggi attentamente dostips.com/forum/viewtopic.php?p=4554#p4554 .
dbenham,

2
@Pacerier c'è abbastanza eco in corso qui per una domanda autonoma. Forse qualcosa sulla falsariga di "quali personaggi possono immediatamente seguire echoe quali sono i loro effetti?"
Matt Wilkie,

68

Come la risposta di Ken, ma con l'uso dell'espansione ritardata.

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

Innanzitutto viene creato un singolo carattere di avanzamento riga e assegnato alla variabile \ n.
Questo funziona quando il cursore alla fine della linea tenta di sfuggire al personaggio successivo, ma se si tratta di un avanzamento riga viene ignorato e il carattere successivo viene letto ed evaso (anche se si tratta anche di un avanzamento riga).
Quindi è necessario un terzo avanzamento riga per terminare l'istruzione corrente, altrimenti la terza riga verrà aggiunta alla variabile LF.
Anche i file batch hanno terminazioni di riga con CR / LF, solo gli LF sono importanti, poiché i CR vengono rimossi in questa fase del parser.

Il vantaggio dell'uso dell'espansione ritardata è che non esiste alcuna gestione speciale dei caratteri.
echo Line1%LF%Line2fallirebbe, poiché il parser interrompe l'analisi ai singoli avanzamenti di riga.

Altre spiegazioni sono disponibili in
SO: comandi lunghi suddivisi su più righe nel file batch (.bat) di Vista / DOS
SO: In che modo gli script Windows Command Interpreter (CMD.EXE) analizzano gli script?

Modifica: Evita echo.

Questo non risponde alla domanda, poiché la domanda riguardava single echoche può produrre più righe.

Ma nonostante le altre risposte che suggeriscono l'uso di echo.per creare una nuova linea, va notato che echo.è il peggiore, poiché è molto lento e può fallire completamente, poiché cmd.exe cerca un file chiamato ECHOe tenta di avviarlo.

Per stampare solo una riga vuota, è possibile utilizzare uno di

echo,
echo;
echo(
echo/
echo+
echo=

Ma l'uso di echo., echo\o echo:dovrebbe essere evitato, in quanto possono essere molto lenti, a seconda della posizione in cui verrà eseguito lo script, come un'unità di rete.


1
Se si passerà la stringa con newline come parametro a una subroutine batch, ad esempio call :pause line1!\n!line2, avviare la subroutine con setlocal EnableDelayedExpansione terminarla con setlocal DisableDelayedExpansionper evitare che le newline vengano interpretate prematuramente.
stevek_mcc,

2
+1 per il cast di personaggi echo, echo; echo( echo/ echo+ echo=e la galleria dei ladri echo. echo\ echo:. Ora, se dovessi spiegare perché in diavolo questi lavori, ti dovrei una birra gratis.
Bob Stein,

40

echo. È stato detto abbastanza.

Se ne hai bisogno in una sola riga, usa il &. Per esempio,

echo Line 1 & echo. & echo line 3

uscirà come:

Line 1

line 3

Ora, dì che vuoi qualcosa di un po 'più elaborato, ...

set n=^&echo.
echo hello %n% world

Uscite

hello
world

Quindi inserisci un %n%quando vuoi una nuova riga in un'istruzione echo. Questo è più vicino al tuo \nusato in varie lingue.

Abbattersi

set n=imposta la variabile nuguale a:

^ Annulla il seguente simbolo da seguire:

&Significa fare un altro comando sulla stessa linea. Non ci interessa il livello di errore (è un'istruzione eco per gridare ad alta voce), quindi non &&è necessario.

echo. Continua l'istruzione echo.

Tutto questo funziona perché puoi effettivamente creare variabili che sono codice e usarle all'interno di altri comandi. È un po 'come una funzione ghetto, dal momento che batch non è esattamente il più avanzato dei linguaggi di shell scripting. Questo funziona solo perché il cattivo utilizzo delle variabili da parte del batch, non indicando naturalmente ints, caratteri, float, stringhe, ecc.

Se sei furbo, potresti farlo funzionare con altre cose. Ad esempio, usandolo per fare eco a una scheda

set t=^&echo.     ::there are spaces up to the double colon

7
Non utilizzare echo.poiché tenta inizialmente di trovare un file con quel nome. Usa altri segni di punteggiatura, comeecho,
Ripristina Monica il

20

Quando si fa eco a qualcosa da reindirizzare a un file, più comandi di eco non funzioneranno. Penso che forse il redirector ">>" sia una buona scelta:

ciao eco> temp
mondo dell'eco >> temp

8
Il primo esempio, usando ">", creerà un nuovo file, il secondo, usando ">>", verrà aggiunto a un file esistente (o lo creerà se non esiste già).
Yann Duran,

1
(echo hello && echo world) > tempmenzionato da Nathan J. Brauer in un commento alle (attuali) opere di risposta accettate.
GeroldBroser ripristina Monica il

15

Proprio come Grimtron suggerisce - ecco un breve esempio per definirlo:

@echo off
set newline=^& echo.
echo hello %newline%world

Produzione

C:\>test.bat
hello
world


1
@blue la nuova riga finale sembra essere funzione del file batch stesso. Se ripeti la echo hello %newline%worldlinea non ci sono spazi tra.
matt wilkie,

2
echo "Hello %newline% world"fallisce perché è all'interno delle virgolette. Perché non è una vera newline.
jeb,

14

Se è necessario inserire i risultati in un file, è possibile utilizzare

(echo a & echo. & echo b) > file_containing_multiple_lines.txt

9

Puoi anche fare così,

(for %i in (a b "c d") do @echo %~i)

L'output sarà,

a
b
c d

Si noti che quando questo viene inserito in un file batch, '%' deve essere raddoppiato.

(for %%i in (a b "c d") do @echo %%~i)

Questa soluzione funziona anche se si desidera echeggiare una e commerciale e non una nuova riga.
parvus,

penso di aver trovato un bug: il *char

7

Se qualcuno viene qui perché stanno cercando di riecheggiare una linea vuota da un makefile MINGW, ho usato

@cmd /c echo.

semplicemente usando echo.provoca il temutoprocess_begin: CreateProcess(NULL, echo., ...) failed. messaggio di errore.

Spero che questo aiuti almeno un'altra persona là fuori :)


Ma questa non è la domanda. Downvote!
Mesalcode

Non sono sicuro se il sarcasmo o no: P
Wayne Uroda,

Scoprilo guardando nella tua casella di posta: D
Mesalcode

3

Se uno ha bisogno di usare famosi \ n in letterali stringa che possono essere passati a una variabile, può scrivere un codice come nello script Hello.bat di seguito:

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

In questo modo l'output multilinea può essere preparato in un posto, anche in altri file scritpt o esterni, e stampato in un altro.

L'interruzione di riga viene mantenuta nella variabile newline . Il suo valore deve essere sostituito dopo l' espansione della riga dell'eco , quindi utilizzo setlocal enableDelayedExpansion per abilitare i punti esclamativi che espandono le variabili durante l'esecuzione. E l'esecuzione sostituisce \ n con i contenuti di nuova riga (cercare la sintassi nel set di aiuto ). Ovviamente potremmo usare ! Newline! durante l'impostazione della risposta ma \ n è più conveniente. Può essere passato dall'esterno (prova Hello R2 \ nD2 ), dove nessuno conosce il nome della variabile che contiene l'interruzione di linea (Sì, Hello C3! Newline! P0funziona allo stesso modo).

L'esempio sopra può essere perfezionato in un sottoprogramma o in un batch autonomo, usato come call:mlecho Hi\nI'm your comuter:

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

Si noti che una barra rovesciata aggiuntiva non impedisce allo script di analizzare \ n sottostringa.


1
Stai essenzialmente facendo la stessa cosa della risposta di Jeb sopra.
Squashman,

Le risposte che ho letto sopra sono state molto utili, ma dovevo chiamare uno script di subroutine che analizzerà, quindi eviterei di implementare il trucco ovunque. Questo aveva bisogno di affinare una soluzione e ho condiviso questo raffinamento. Spero che non abbia fatto del male a nessun animale.
Tomator,

2

Questo ha funzionato per me, non è necessaria un'espansione ritardata:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

Scrive l'output in questo modo:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .

4
-1 echo asdf >myfile.txtprodurrà esattamente gli stessi risultati. echoaggiunge una nuova riga alla fine della stringa.
BlueRaja - Danny Pflughoeft il

2
Ottima risposta, essendo l'unica persona che ha riconosciuto il valore dell'uso della parentesi per nuove righe. Credo che sia così che i produttori di DOS intendevano farlo.
Djangofan,

2

Per iniziare una nuova riga in batch, tutto ciò che devi fare è aggiungere "echo [", in questo modo:

echo Hi!
echo[
echo Hello!

5
È lento e fallisce quando esiste un file con il nomeecho[.bat
jeb

Che cosa? Dovrebbe funzionare all'istante e anche cancellare il file echo [.bat.
PryroTech,

2
È praticamente la stessa cosa dell'eco. sintassi.
PryroTech,

5
Sì ed echo.è anche una cattiva soluzione.
Jeb

1
Come si può vedere nelle risposte precedenti, questo tenterà di individuare prima un file sul percorso, il che lo rende così lento. Lo stesso vale per echo.. Aspettarsi che gli utenti del tuo script eliminino i file sul loro sistema solo perché il tuo script ha bisogno di una nuova riga non mi sembra un buon design.
Abele,

2

Le soluzioni Ken e Jeb funzionano bene.

Ma le nuove righe sono generate solo con un carattere LF e ho bisogno di caratteri CRLF (versione Windows).

A questo scopo, alla fine della sceneggiatura, ho convertito LF in CRLF.

Esempio:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt

0

Puoi usare @echo(@echo + [spazio] + [spazio instabile])

Nota: lo spazio insicuro può essere ottenuto con Alt + 0160

Spero che sia d'aiuto :)

[modifica] Hmm hai ragione, ne avevo bisogno in un Makefile, funziona perfettamente lì. Immagino che la mia risposta non sia adatta ai file batch ... Mio male.


Non ho ECHO ist eingeschaltet (ON).una riga vuota, ho provato al prompt cmd
jeb

1
Questo è uno spazio non-break, non una newline.
Ry-

0

Questa soluzione funziona (testata):

type nul | more /e /p

Ciò converte gli avanzamenti di linea isolati nella combinazione di avanzamento di linea di ritorno carrello.


Ma come si aggiunge una nuova riga tra un testo? La domanda riguardaecho hello \n world
jeb,

Downvote da me. Questa non è una risposta alla domanda
Mesalcode

-2

Non posso renderlo più semplice di:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
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.