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

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

Quiero hacer algo como:

echo hello\nworld

Que daría como resultado:

hello
world

preguntado el 25 de septiembre de 08 a las 09:09

Me resultó útil. Tuve que hacer echo \ n \ n | my_app.exe en un script. Lo hice (echo. && echo.) | my_app.exe -

Easy Approach "El código comienza:"> echo hello & echo world, te dará lo que necesitas -

Puede insertar un ascii chr (255) invisible 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 "eco (alt + 255)"¡Solo puedes usar el teclado, no los números en la parte superior del teclado querty! -

Así como la mitad de la reparación de computadoras es enchufarla y encenderla, la mitad del desarrollo de software es lo que yo llamo ingeniería espacial. Nosotros necesite nuestras líneas en blanco así. -

@jwzumwalt gracias por la sugerencia alt + 255, funciona muy bien en la línea de comandos -

18 Respuestas

echo hello & echo.world

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

Respondido 19 Abr '18, 14:04

el ejemplo no necesita un punto, pero sí necesita uno para repetir una línea vacía en blanco: echo. && echo hello && echo. && echo world - Matt Wilkie

¿Puede hacer esto con un solo eco para que pueda ser redirigido a un archivo? - Shahbaz

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

La cosa del período en "eco". nunca deja de asombrarme. Está tan 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, escribo esto solo como recordatorio: "echo". ! = "eco". ! - quetzalcóatl

@quetzalcoatl, se vuelve aún más extraño. Otros personajes además de los puntos también funcionan. SS64 dice que una mejor sintaxis es echo( para un mejor rendimiento (aún sin espacio, no importa). Amplia discusión de otros personajes y sus méritos / defectos en ECO. FALLA al dar texto o línea en blanco - En su lugar, use ECHO / - Matt Wilkie

Uso:

echo hello
echo.
echo world

Respondido 01 Abr '17, 07:04

¿Es posible mientras se proporciona una cadena dentro de una sola declaración de eco? - Brian R. Bondy

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

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

Use & (o &&) para hacerlos en una sola declaración: por ejemplo, para poner "hola \ nmundo" en un archivo txt: (echo hello & echo world) >> ./test.txt - Ned Martín

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

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 un resultado como el siguiente:

There should be a newline
inserted here.

Press any key to continue . . .

Obviamente, solo necesita el código entre las declaraciones REM.

Respondido 26 Feb 18, 15:02

Muy impresionante, ¿podría tomarse un tiempo para explicar cómo funciona el conjunto de líneas NL = ^^^% NLM %% NLM% ^% NLM %% NLM%? No puedo entenderlo del todo ... andy morris

@andy me cree que un comentario de +8 justifica una pregunta: stackoverflow.com/questions/6379619/… - Matt Wilkie

¡Este es un ejemplo maravilloso para mostrar que cmd.exe y los archivos por lotes de Windows son una locura! - mivk

NOTA PARA MISMO: La línea "set NLM = ^" debe: no tengo nada después del CARET y debe: tiene 2 líneas en blanco después. - mnemotrónico

Vea mi respuesta para un método más simple. set nl=^&echo., entonces solo echo hello %nl% world produce el mismo efecto. - coltonón

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

Respondido el 26 de junio de 10 a las 09:06

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

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

@naxa: nada oficial, solo conocimiento colectivo derivado de algunos piratas informáticos. El objetivo es tener una sintaxis que pueda usarse para ECHO cualquier valor, incluido nada, y nunca tener que preocuparse por obtener nada más que lo esperado. El mejor resumen que conozco está en dostips.com/forum/viewtopic.php?p=4554#p4554. Te deja colgado, pero a nadie se le ha ocurrido un escenario en el que ECHO( falla. - dbenham

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

@Pacerier hay suficiente echo pasando aquí para una pregunta independiente. Quizás algo como "qué personajes pueden seguir inmediatamente echo, y cuales son sus efectos? "- Matt Wilkie

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

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 ya que el símbolo de intercalación 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 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 a la variable LF.
Incluso los archivos por lotes tienen finales 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 retardada es que no hay ningún manejo especial de caracteres.
echo Line1%LF%Line2 fallaría, ya que el analizador deja de analizar en un solo avance de línea.

Más explicaciones están en
SO: Los comandos largos se dividen en varias líneas en un archivo por lotes (.bat) de Vista / DOS
SO: ¿Cómo analiza el intérprete de comandos de Windows (CMD.EXE) las secuencias de comandos?

Editar: evitar echo.

Esto no responde a la pregunta, ya que la pregunta era sobre solteros echo que puede generar varias líneas.

Pero a pesar de las otras respuestas, quien sugiere el uso de echo. para crear una nueva línea, debe tenerse en cuenta que echo. es el peor, ya que es muy lento y puede fallar completamente, ya que cmd.exe busca un archivo llamado ECHO e 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\ or echo: deben evitarse, ya que pueden ser muy lentos, dependiendo de la ubicación donde se ejecutará el script, como una unidad de red.

contestado el 23 de mayo de 17 a las 13:05

Si pasará la cadena con nuevas líneas como parámetro a una subrutina por lotes, p. Ej. call :pause line1!\n!line2, inicie la subrutina con setlocal EnableDelayedExpansion y terminarlo con setlocal DisableDelayedExpansion para evitar que las nuevas líneas se interpreten prematuramente. - stevek_mcc

+1 para el elenco de personajes echo, echo; echo( echo/ echo+ echo= y la galería de los pícaros echo. echo\ echo:. Ahora, si me explicaras por qué diablos funcionan, te debo una cerveza gratis. - bob stein

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, diga que quiere algo un poco más elegante ...

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

Salidas

hello
world

Entonces solo lanza un %n% siempre que desee una nueva línea en una declaración de eco. Esto está más cerca de tu \n utilizado en varios idiomas.

Breakdown

set n= establece la variable n igual a:

^ Anula el siguiente símbolo siguiente:

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

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

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

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

Respondido el 29 de junio de 16 a las 06:06

No utilizan el echo. ya que primero intenta encontrar un archivo con ese nombre. Utilice otra puntuación, como echo, - Kuba no se ha olvidado de Monica

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

echo hola> temp echo world >> temp

Respondido 09 ago 09, 02:08

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

(echo hello && echo world) > temp mencionado por Nathan J. Brauer en un comentario a la respuesta aceptada (actual) funciona. - Geroldo Broser

Si necesita poner los resultados en un archivo, puede usar

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

Respondido el 02 de Septiembre de 14 a las 01:09

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

Respondido 21 Oct 15, 10:10

De hecho, se repetirá una nueva línea adicional después de "world" - BlueRaja - Danny Pflughoeft

@blue, la nueva línea final parece ser función del archivo por lotes en sí. Si repites el echo hello %newline%world línea no hay espacios entre ellos. - Matt Wilkie

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

Veo esto en todas partes y es engañoso / confuso y, por supuesto, terriblemente ineficiente en comparación con la versión real de nueva línea. - HaxAddict1337

También puedes hacer esto,

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

La salida será,

a
b
c d

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

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

Respondido el 29 de Septiembre de 11 a las 20:09

Esta solución también funciona si desea hacer eco de un ampersand & en lugar de una nueva línea. - El pequeño

Creo que encontré un error: el * char - usuario6250760

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

@cmd /c echo.

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

Espero que esto ayude al menos a otra persona :)

Respondido 22 Abr '13, 05:04

No estoy seguro de si es sarcasmo o no: P - Wayne Uroda

Descúbrelo mirando en tu bandeja de entrada: D - código de mesa

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

echo Hi!
echo[
echo Hello!

Respondido el 16 de diciembre de 16 a las 20:12

Es lento y falla cuando existe un archivo con el nombre echo[.bat - Jeb

¿Qué? Debería funcionar instantáneamente, y también simplemente eliminar el archivo echo [.bat. - PryroTech

Es exactamente lo mismo que echo. sintaxis. - PryroTech

si y echo. también es una mala solución. - Jeb

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

Las soluciones de Ken y Jeb funcionan bien.

Pero las nuevas líneas se generan con solo 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

Respondido 01 Abr '17, 07:04

Si uno necesita usar famoso \ n en cadenas literales que se pueden pasar a una variable, puede escribir un código como en el Hola murciélago guión 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 scritpt o externo, e imprimirse en otro.

El salto de línea se mantiene en nueva línea variable. Su valor debe ser sustituido después de echo la línea se expande, así que uso setlocal enableDelayedExpansion para habilitar signos de exclamación que expanden las variables durante la ejecución. Y la ejecución sustituye \n nueva línea contenidos (busque la sintaxis en conjunto de ayuda). Por supuesto que podríamos usar !¡nueva línea! mientras configura el https://www.youtube.com/watch?v=xB-eutXNUMXJtA&feature=youtu.be pero \n es más conveniente. Puede transmitirse desde el exterior (intente Hola R2 \ nD2), donde nadie sabe el nombre de la variable que contiene el salto de línea (Sí, ¡Hola C3! ¡Nueva línea! P0 funciona de la misma manera).

El ejemplo anterior se puede refinar a una subrutina o lote independiente, usado 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 invertida adicional no evitará que el script analice la subcadena \ n.

Respondido 08 Feb 18, 10:02

Básicamente, estás haciendo lo mismo que la respuesta de Jeb anterior. - squashman

Las respuestas que leí arriba fueron muy útiles, pero necesitaba llamar a un script de subrutina que analizará \ n para evitar 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. - tomate

Esta respuesta es útil, pero dado que los signos de exclamación se interpretan, ¿cómo puede su argumento mostrar un signo de exclamación literal? Intenté escapar de ellos prefijando uno o dos signos de intercalación, pero no funcionó. - florencio

@FlorentAngly, prueba esto: set ex=! setlocal enableDelayedExpansion echo shout!ex! - tomate

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

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

Respondido el 03 de diciembre de 13 a las 15:12

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

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

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

Respondido 19 Jul 13, 08:07

tengo ECHO ist eingeschaltet (ON). no es una línea vacía, intentado en el símbolo del sistema cmd - Jeb

Ese es un espacio que no se rompe, no una nueva línea. - Ry- ♦

¿Por qué no usar subcadena / reemplazar espacio para echo;?

set "_line=hello world"
echo\%_line: =&echo;%
  • Resultados:
hello
world
  • O reemplace \ n por echo;
set "_line=hello\nworld"
echo\%_line:\n=&echo;%

Respondido 05 Oct 20, 13:10

Esta solución funciona (probada):

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.

Respondido el 10 de enero de 20 a las 16:01

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

Voto en contra de mí. Esta no es una respuesta a la pregunta: código de mesa

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.