Domanda

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

Voglio fare qualcosa del tipo:

echo hello\nworld

Che produrrebbe:

hello
world
È stato utile?

Soluzione

ciao eco & amp; echo.world

Ciò significa che puoi definire & amp; echo. come costante per una nuova riga \ n .

Altri suggerimenti

Usa:

echo hello
echo.
echo world

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

Ovviamente è necessario solo il codice tra le istruzioni REM.

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

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"

Per prima cosa viene creato un singolo carattere di avanzamento riga e assegnato alla variabile \ n.
Funziona quando il cursore alla fine della riga cerca 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 di utilizzare l'espansione ritardata è che non esiste alcuna gestione speciale dei caratteri.
echo Line1% LF% Line2 non riuscirebbe, poiché il parser interrompe l'analisi ai singoli avanzamenti di riga.

Altre spiegazioni sono disponibili in
SO: comandi lunghi suddiviso su più righe nel file batch (.bat) Vista / DOS
SO: come funziona l'interprete dei comandi di Windows (CMD.EXE) analizzano gli script?

Modifica: evita echo.

Questo non risponde alla domanda, poiché la domanda riguardava il singolo echo che 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 ECHO e prova ad avviarlo.

Per stampare solo una riga vuota, è possibile utilizzare una delle

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 del posizione in cui verrà eseguito lo script, come un'unità di rete.

echo. È stato detto abbastanza.

Se ne hai bisogno in una sola riga, usa & amp; . Ad esempio,

echo Line 1 & echo. & echo line 3

sarebbe prodotto come:

Line 1

line 3

Ora, supponiamo che tu voglia qualcosa di un po 'più elaborato, ...

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

Uscite

hello
world

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

Ripartizione

set n = imposta la variabile n uguale a:

^ Annulla il seguente simbolo da seguire:

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

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é lo scarso 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

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

echo hello > temp
echo world >> temp

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

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

uscita
C:\>test.bat
hello
world

Se devi inserire i risultati in un file, puoi usare

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

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)

Se qualcuno viene qui perché sta cercando di riecheggiare una riga vuota da un makefile MINGW make, ho usato

@cmd / c echo.

semplicemente usando echo. provoca il temuto process_begin: CreateProcess (NULL, echo., ...) non riuscito. messaggio di errore.

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

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

echo Hi!
echo[
echo Hello!

Questo ha funzionato per me, non è necessaria l'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 . . .

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

In questo, alla fine dello script, ho convertito LF in CRLF.

Esempio:

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

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 la riga echo viene espansa, quindi utilizzo setlocal enableDelayedExpansion per abilitare i punti esclamativi che espandono le variabili durante l'esecuzione. E l'esecuzione sostituisce \ n con newline (cerca la sintassi in help set ). Ovviamente potremmo usare ! Newline! mentre impostiamo la risposta ma \ n è più conveniente. Può essere passato dall'esterno (prova Ciao R2 \ nD2 ), dove nessuno conosce il nome della variabile che contiene l'interruzione di linea (Sì, Ciao C3! Newline! P0 funziona il allo stesso modo).

L'esempio sopra può essere perfezionato in un sottoprogramma o in un batch autonomo, usato come call: mlecho Ciao \ nSono il tuo computer :

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

Puoi usare @echo (@echo + [spazio] + [spazio non sicuro])

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

Non posso renderlo più semplice di:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat

Il modo più conservatore di caratteri per ottenere questo risultato nei sistemi linux, è con l'alias -e - che interpreta i caratteri di escape che sono sottoposti a backslash.

echo -e "hello\nworld"

Ecco altri esempi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top