¿Cómo puedo hacer eco de una nueva línea en un archivo por lotes?
Frecuentes
Visto 1,038 equipos
677
¿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
18 Respuestas
487
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
595
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
145
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
100
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
72
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
42
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
21
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
16
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
14
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
10
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
8
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
3
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
3
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
3
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
2
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
1
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
0
¿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
-3
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 windows batch-file newline or haz tu propia pregunta.
Me resultó útil. Tuve que hacer echo \ n \ n | my_app.exe en un script. Lo hice (echo. && echo.) | my_app.exe - Vignesh
Easy Approach "El código comienza:"> echo hello & echo world, te dará lo que necesitas - prudviraj
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! - jwzumwalt
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í. - Bob Stein
@jwzumwalt gracias por la sugerencia alt + 255, funciona muy bien en la línea de comandos - K Vij