¿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
Brian R. Bondy
fuente
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.

Grimtron
fuente
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
Matt Lacey
fuente
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.

jeb
fuente
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
macropas
fuente
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.

jeb
fuente
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
coltonon
fuente
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
Rey Crend
fuente
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
Peter Mortensen
fuente
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
test30
fuente
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)
Albert
fuente
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í :)

Wayne Uroda
fuente
Pero esa no es la pregunta. ¡Voto negativo!
Mesalcode
No estoy seguro si sarcasmo o no: P
Wayne Uroda
Descúbrelo
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.

Tomator
fuente
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 . . .
NahuelGQ
fuente
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!
PryroTech
fuente
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
otaviodecampos
fuente
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.

johan d
fuente
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.

Wasif Hasan
fuente
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
strance
fuente