¿Cómo puedo repetir una nueva línea en un archivo por lotes?


642

¿Cómo puede insertar una nueva línea desde la salida de su archivo por lotes?

Quiero hacer algo como:

echo hello\nworld

Lo que daría salida:

hello
world

66
Entró útil para mí. Tuve que hacer echo \ n \ n | my_app.exe en un script. Lo hice (echo. && echo.) | my_app.exe
Vignesh

2
Fácil Approach "comienza Código:"> echo hola y eco mundial, lo que da au u necesidad
prudviraj

1
Puede insertar un ascii chr invisible (255) en una línea separada que forzará una nueva línea en blanco. Mantenga presionada la tecla [alt] y presione 255 en el teclado. esto inserta chr (255) que es un cuadrado en blanco. es decir, " echo (alt + 255) " ¡Solo puede usar el teclado, no los números en la parte superior del teclado de consulta!
jwzumwalt

Así como la mitad de la reparación de la computadora lo conecta y lo enciende, la mitad del desarrollo de software es lo que yo llamo ingeniería espacial . Nosotros necesitamos nuestras líneas en blanco tan.
Bob Stein el

Qué tal esto ? echo Yes&echo No
scientist_7

Respuestas:


462

echo hello & echo.world

Esto significa que podría definir & echo.como una constante para una nueva línea \n.


43
el ejemplo no necesita un punto, pero sí necesita uno para hacer eco de una línea vacía en blanco:echo. && echo hello && echo. && echo world
Matt wilkie

44
¿Se puede hacer esto con un solo eco para que se pueda redirigir a un archivo?
Shahbaz

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

25
La cosa del período en "eco". nunca deja de sorprenderme Está muy anticuado, y aún así siempre olvido que el punto debe estar estrictamente concatenado con el nombre del comando, sin espacios entre ellos. No hay ningún error en la publicación tuya, estoy escribiendo esto solo como un recordatorio: "echo". ! = "echo". !
quetzalcoatl

55
@quetzalcoatl, se vuelve aún más extraño. Otros personajes además del punto funcionan también. SS64 dice que una mejor sintaxis es echo(para mejorar el rendimiento (aún sin tener en cuenta el espacio). Discusión extendida de otros personajes y sus méritos / defectos en ECHO. FALLA en dar texto o línea en blanco - En su lugar use ECHO /
matt wilkie

558

Utilizar:

echo hello
echo.
echo world

16
¿Es posible al proporcionar una cadena dentro de una sola declaración de eco?
Brian R. Bondy

55
¿Por qué necesita hacerlo con una sola declaración de eco; ¿Dónde está el daño de tener otro?
Rob

3
@ Rob, acabo de encontrar este problema y ninguno de estos funciona. Necesita hacer eco en una sola declaración en mi ejemplo. Estoy generando algunos archivos de texto desde HTML y generando un Makefile usando echo "Makefile contents (which has \n)" > MakefileCon múltiples ecos, no funcionaría
Shahbaz

3
Use & (o &&) para hacerlos en una sola declaración: Por ejemplo, para poner "hello \ nworld" en un archivo txt:(echo hello & echo world) >> ./test.txt
Ned Martin

44
Para la salida de varias líneas a un archivo, ¿por qué no simplemente hacer lo siguiente? echo line 1 > Makefiley luego echo line 2 >> Makefile. El uso de >>hace que la salida se agregue al archivo, que es precisamente el comportamiento que necesita para este caso.
dgnuff

141

Aquí tienes, crea un archivo .bat con lo siguiente:

@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

Debería ver una salida como la siguiente:

There should be a newline
inserted here.

Press any key to continue . . .

Solo necesita el código entre las declaraciones REM, obviamente.


51
Muy impresionante, ¿podría tomarse el tiempo para explicar cómo funciona el conjunto de líneas NL = ^^^% NLM %% NLM% ^% NLM %% NLM%? No puedo entenderlo todo
Andy Morris

8
@andy piensa que un comentario +8 justifica una pregunta: stackoverflow.com/questions/6379619/…
matt wilkie

82
¡Este es un maravilloso ejemplo para demostrar que cmd.exe y los archivos por lotes de Windows son totalmente locos!
mivk

12
NOTA PARA SI MISMO: La línea "set NLM = ^" no debe tener nada después de CARET y debe tener 2 líneas en blanco después de ella.
mnemotronic

44
Vea mi respuesta para un método más simple. set nl=^&echo., entonces solo echo hello %nl% worldproduce el mismo efecto.
coltonon

96

Hay una característica estándar echo:en cmd / bat-files para escribir una línea en blanco, que emula una nueva línea en su cmd-output:

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

Salida del archivo cmd citado anteriormente:

line1

line2

37
De hecho, cualquier personaje especial NO UTILIZADO debería funcionar. Siempre aliento el uso de / porque la barra diagonal es el carácter estándar para las opciones de comando. Además, siempre critico el uso del punto que alguien en Microsoft desafortunadamente elige porque el comando: echo.com da resultados diferentes dependiendo de la versión del procesador de comandos MS-DOS / Windows Batch.
Aacini

21
La única versión que siempre funciona es echo(. Parece que podría causar problemas, pero en realidad funciona perfectamente. Todas las demás formas tienen al menos una situación en la que el comando no funcionará como se desea.
dbenham

55
@naxa: nada oficial, solo conocimiento colectivo derivado de unos pocos hackers. El objetivo es tener una sintaxis que se pueda utilizar para ECHO cualquier valor, incluso nada, y nunca tener que preocuparse por obtener algo más que lo que se espera. El mejor resumen que conozco está en dostips.com/forum/viewtopic.php?p=4554#p4554 . Te deja colgado, pero a nadie se le ocurre un escenario en el que ECHO(falle.
dbenham

2
@Pacerier: hay ejemplos de fallas para cada una de esas sugerencias. Lea atentamente dostips.com/forum/viewtopic.php?p=4554#p4554 .
dbenham

2
@Pacerier, hay suficiente eco aquí para una pregunta independiente. Quizás algo en la línea de "¿qué personajes pueden seguir inmediatamente echoy cuáles son sus efectos?"
matt wilkie

68

Como la respuesta de Ken, pero con el uso de la expansión demorada.

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

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

Primero se crea un único carácter de salto de línea y se asigna a la variable \ n.
Esto funciona cuando el cursor al final de la línea intenta escapar del siguiente carácter, pero si se trata de un salto de línea, se ignora y el siguiente carácter se lee y se escapa (incluso si esto también es un salto de línea).
Luego, necesita un tercer salto de línea para finalizar la instrucción actual; de lo contrario, la tercera línea se agregará a la variable LF.
Incluso los archivos por lotes tienen terminaciones de línea con CR / LF, solo los LF son importantes, ya que los CR se eliminan en esta fase del analizador.

La ventaja de usar la expansión retrasada es que no hay ningún manejo especial de caracteres.
echo Line1%LF%Line2fallaría, ya que el analizador deja de analizar en saltos de línea únicos.

Hay más explicaciones en
SO: los comandos largos se dividen en varias líneas en el archivo por lotes de Vista / DOS (.bat)
SO: ¿Cómo analiza los scripts de Windows Command Interpreter (CMD.EXE)?

Editar: evitar echo.

Esto no responde la pregunta, ya que la pregunta era sobre un solo echoque puede generar múltiples líneas.

Pero a pesar de las otras respuestas que sugieren el uso de echo.para crear una nueva línea, debe tenerse en cuenta que echo.es lo peor, ya que es muy lento y puede fallar por completo, ya que cmd.exe busca un archivo llamado ECHOe intenta iniciarlo.

Para imprimir solo una línea vacía, puede usar uno de

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

Pero el uso de echo., echo\o echo:debería evitarse, ya que pueden ser realmente lentos, dependiendo de la ubicación donde se ejecutará el script, como una unidad de red.


1
Si va a pasar la cadena con nuevas líneas como parámetro a una subrutina por lotes, por ejemplo call :pause line1!\n!line2, inicie la subrutina con setlocal EnableDelayedExpansiony setlocal DisableDelayedExpansiontermínela para evitar que las nuevas líneas se interpreten prematuramente.
stevek_mcc

2
+1 para el elenco de personajes echo, echo; echo( echo/ echo+ echo=y la galería de pícaros echo. echo\ echo:. Ahora, si tuvieras que explicar por qué demonios estos trabajos, te debo una cerveza gratis.
Bob Stein el

40

echo. Basta de charla.

Si lo necesita en una sola línea, use el &. Por ejemplo,

echo Line 1 & echo. & echo line 3

saldría como:

Line 1

line 3

Ahora, digamos que quieres algo un poco más elegante, ...

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

Salidas

hello
world

Luego, simplemente agregue un %n%cuando quiera una nueva línea en una declaración de eco. Esto está más cerca de su \nuso en varios idiomas.

Descompostura

set n=establece la variable nigual a:

^ Anula el siguiente símbolo a seguir:

&Significa hacer otro comando en la misma línea. No nos importa el nivel de error (es una declaración de eco para llorar en voz alta), por lo que no &&es necesario.

echo. Continúa la declaración de eco.

Todo esto funciona porque en realidad puedes crear variables que son código y usarlas dentro de otros comandos. Es algo así como una función de ghetto, ya que el lote no es exactamente el más avanzado de los lenguajes de script de shell. Esto solo funciona porque el mal uso de variables por lotes, no designa naturalmente entre ints, chars, flotantes, cadenas, etc.

Si eres astuto, podrías hacer que esto funcione con otras cosas. Por ejemplo, usarlo para hacer eco de una pestaña

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

77
No lo use, echo.ya que primero intenta encontrar un archivo con ese nombre. Utilice otros signos de puntuación, comoecho,
Restablecer a Monica el

20

Al hacer eco de algo para redirigir a un archivo, varios comandos de eco no funcionarán. Creo que quizás el redirector ">>" es una buena opción:

echo hola> temp
echo world >> temp

8
El primer ejemplo, usando ">", creará un nuevo archivo, el segundo, usando ">>", se agregará a un archivo existente (o lo creará si aún no existe).
Yann Duran

1
(echo hello && echo world) > tempmencionado por Nathan J. Brauer en un comentario a los trabajos de respuesta aceptados (actuales).
GeroldBroser reintegra a Mónica el

15

Tal como sugiere Grimtron, aquí hay un ejemplo rápido para definirlo:

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

Salida

C:\>test.bat
hello
world

En realidad, se hará eco de una nueva línea adicional después de "mundo"
BlueRaja - Danny Pflughoeft

1
@blue la nueva línea final parece ser función del archivo por lotes en sí. Si repite la echo hello %newline%worldlínea, no hay espacios entre ellas.
Matt Wilkie

2
echo "Hello %newline% world"falla ya que está dentro de las comillas. Porque no es una nueva línea real .
jeb

14

Si necesita poner resultados a un archivo, puede usar

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

9

También puedes hacer así,

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

La salida será,

a
b
c d

Tenga en cuenta que cuando esto se coloca en un archivo por lotes, '%' se duplicará.

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

Esta solución también funciona si desea hacer eco de un signo y & en lugar de una nueva línea.
parvus

Creo que encontré un error: el *char

7

Si alguien viene aquí porque está buscando hacer eco de una línea en blanco de un makefile MINGW, utilicé

@cmd /c echo.

simplemente usando echo.causa el temido process_begin: CreateProcess(NULL, echo., ...) failed.mensaje de error.

Espero que esto ayude al menos a otra persona por ahí :)


Pero esa no es la pregunta. ¡Voto negativo!
Mesalcode

No estoy seguro si sarcasmo o no: P
Wayne Uroda


3

Si se necesita usar \ n famoso en literales de cadena que se pueden pasar a una variable, puede escribir un código como en el script Hello.bat a continuación:

@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!%

De esta forma, la salida multilínea puede prepararse en un lugar, incluso en otro archivo externo o scritpt, e imprimirse en otro.

El salto de línea se mantiene en la variable de nueva línea . Su valor debe ser sustituido después de que la línea de eco se expande, por lo que uso setlocal enableDelayedExpansion para habilitar signos de exclamación que expanden las variables en la ejecución. Y la ejecución sustituye \ n con contenido de nueva línea (busque la sintaxis en el conjunto de ayuda ). Por supuesto, podríamos usar ! Newline! mientras configura la respuesta pero \ n es más conveniente. Se puede pasar desde afuera (pruebe Hello R2 \ nD2 ), donde nadie sabe el nombre de la variable que contiene el salto de línea (Sí, Hello C3! Newline! P0 funciona de la misma manera).

El ejemplo anterior se puede refinar a una subrutina o lote independiente, utilizado como call:mlecho Hi\nI'm your comuter:

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


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

Tenga en cuenta que la barra diagonal inversa adicional no impedirá que el script analice \ n subcadena.


1
Básicamente estás haciendo lo mismo que la respuesta de Jeb anterior.
Squashman

Las respuestas que leí anteriormente fueron muy útiles, pero necesitaba llamar a una secuencia de comandos desde la subrutina que analizaría \ n, así que evitaría implementar el truco en todas partes. Esto necesitaba refinar una solución y compartí este refinamiento. Espero que no haya dañado a ningún animal.
Tomator

2

Esto funcionó para mí, no es necesaria una expansión tardía:

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

Escribe una salida como esta:

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

44
-1 echo asdf >myfile.txtproducirá exactamente los mismos resultados. echoagrega una nueva línea al final de la cadena.
BlueRaja - Danny Pflughoeft

2
Gran respuesta, siendo la única persona que reconoció el valor de usar el paréntesis para nuevas líneas. Creo que así es como los creadores de DOS pretendían que lo hicieras.
djangofan

2

Para comenzar una nueva línea en lote, todo lo que tiene que hacer es agregar "echo [", así:

echo Hi!
echo[
echo Hello!

55
Es lento y falla cuando existe un archivo con el nombreecho[.bat
jeb

¿Qué? Debería funcionar al instante, y también simplemente eliminar el archivo echo [.bat.
PryroTech

2
Es casi exactamente lo mismo que echo. sintaxis.
PryroTech

55
Sí, y también echo.es una mala solución.
jeb

1
Como se puede ver en respuestas anteriores, esto intentará localizar primero un archivo en la ruta, lo que hace que sea muy lento. Lo mismo es cierto para echo.. Esperar que los usuarios de su script eliminen archivos en su sistema solo porque su script necesita una nueva línea no me parece un buen diseño.
Abel

2

Las soluciones de Ken y Jeb funcionan bien.

Pero las nuevas líneas se generan solo con un carácter LF y necesito caracteres CRLF (versión de Windows).

Para esto, al final del script, he convertido LF a CRLF.

Ejemplo:

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

0

Puede usar @echo(@echo + [espacio] + [espacio insecable])

Nota: El espacio insecable se puede obtener con Alt + 0160

Espero eso ayude :)

[editar] Hmm tienes razón, lo necesitaba en un Makefile, funciona perfectamente allí. Supongo que mi respuesta no está adaptada para archivos por lotes ... Mi problema.


No obtuve ECHO ist eingeschaltet (ON).una línea vacía, probé en el cmd-prompt
jeb

1
Ese es un espacio sin interrupciones, no una nueva línea.
Ry-

0

Esta solución funciona (probado):

type nul | more /e /p

Esto convierte los avances de línea aislados en una combinación de avance de línea de retorno de carro.


Pero, ¿cómo agrega esto una nueva línea entre un texto? La pregunta es sobreecho hello \n world
jeb

Voto negativo de mi parte. Esta no es una respuesta a la pregunta
Mesalcode

-2

No puedo hacerlo más simple que:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.