Come è possibile inserire una nuova riga dall'output del file batch?
Voglio fare qualcosa del tipo:
echo hello\nworld
Che produrrebbe:
hello
world
echo Yes&echo No
Come è possibile inserire una nuova riga dall'output del file batch?
Voglio fare qualcosa del tipo:
echo hello\nworld
Che produrrebbe:
hello
world
echo Yes&echo No
Risposte:
echo hello & echo.world
Ciò significa che potresti definire & echo.
una costante per una nuova riga \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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 /
Uso:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
Con più echi, non funzionerebbe
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
e poi echo line 2 >> Makefile
. L'uso di >>
provoca l'aggiunta dell'output al file, che è esattamente il comportamento necessario per questo caso.
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.
set nl=^&echo.
, quindi echo hello %nl% world
produce solo lo stesso effetto.
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
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.
ECHO(
fallisce.
echo
e quali sono i loro effetti?"
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%Line2
fallirebbe, 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 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 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.
call :pause line1!\n!line2
, avviare la subroutine con setlocal EnableDelayedExpansion
e terminarla con setlocal DisableDelayedExpansion
per evitare che le newline vengano interpretate prematuramente.
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.
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 \n
usato in varie lingue.
Abbattersi
set n=
imposta la variabile n
uguale 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
echo.
poiché tenta inizialmente di trovare un file con quel nome. Usa altri segni di punteggiatura, comeecho,
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
(echo hello && echo world) > temp
menzionato da Nathan J. Brauer in un commento alle (attuali) opere di risposta accettate.
Proprio come Grimtron suggerisce - ecco un breve esempio per definirlo:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
linea non ci sono spazi tra.
echo "Hello %newline% world"
fallisce perché è all'interno delle virgolette. Perché non è una vera newline.
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é 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 :)
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.
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 . . .
echo asdf >myfile.txt
produrrà esattamente gli stessi risultati. echo
aggiunge una nuova riga alla fine della stringa.
Per iniziare una nuova riga in batch, tutto ciò che devi fare è aggiungere "echo [", in questo modo:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
è anche una cattiva soluzione.
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.
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
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.
ECHO ist eingeschaltet (ON).
una riga vuota, ho provato al prompt cmd
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.
echo hello \n world