Pregunta

¿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 resultado:

hello
world
¿Fue útil?

Solución

echo hello & amp; echo.world

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

Otros consejos

Uso:

echo hello
echo.
echo world

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 necesitas el código entre las declaraciones REM, obviamente.

Hay una función estándar echo: en cmd / bat-files para escribir una línea en blanco, que emula una nueva línea en su salida de cmd:

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

Salida del archivo cmd citado arriba:

line1

line2

Me gusta la respuesta de Ken, pero con el uso de la expansión retrasada.

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 en el extremo 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 avance 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 el LF es importante, 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 de caracteres especiales.
echo Line1% LF% Line2 fallaría, ya que el analizador deja de analizar en líneas individuales.

Más explicaciones están en
SO: Comandos largos dividido en varias líneas en un archivo por lotes de Vista / DOS (.bat)
SO: ¿Cómo funciona el intérprete de comandos de Windows? (CMD.EXE) analizar scripts?

Editar: Evita echo.

Esto no responde a la pregunta, ya que se trataba de un único echo que puede generar varias líneas.

Pero a pesar de las otras respuestas que sugieren el uso de echo. para crear una nueva línea, se debe tener en cuenta que echo. es lo 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 una de

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

Pero se debe evitar el uso de echo. , echo \ o echo: , ya que pueden ser muy lentos, dependiendo de la ubicación donde se ejecutará el script, como una unidad de red.

echo. Ya he dicho.

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

echo Line 1 & echo. & echo line 3

se mostraría como:

Line 1

line 3

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

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

Salidas

hello
world

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

Desglose

set n = establece la variable n igual a:

^ Anula el siguiente símbolo a seguir:

& amp; 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), por lo que no se necesita & amp; & amp; .

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

Todo esto funciona porque realmente puedes crear variables que son códigos y usarlas dentro de otros comandos. Es algo así como una función de ghetto, ya que batch no es exactamente el más avanzado de los lenguajes de shell shell. Esto solo funciona porque el uso deficiente de las variables por lotes, no se designa entre partes, caracteres, flotadores, cadenas, etc., naturalmente.

Si eres astuto, podrías conseguir que esto funcione con otras cosas. Por ejemplo, usándolo para mostrar una pestaña

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

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

echo hello > temp
echo world >> temp

Tal como lo 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

Si necesita poner los resultados en un archivo, puede usar

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

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á el '%'.

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

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

@cmd / c echo.

simplemente utilizando echo. hace que el temido process_begin: CreateProcess (NULL, echo., ...) haya fallado. mensaje de error.

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

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

echo Hi!
echo[
echo Hello!

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

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

Escribe salida como esta:

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

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

A esto, al final de la secuencia de comandos, he convertido LF a CRLF.

Ejemplo:

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

Si es necesario usar \ n en famosos 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 manera, la salida multilínea se puede preparar en un lugar, incluso en otro archivo externo o de revisión, e imprimirse en otro.

El salto de línea se mantiene en la variable nueva línea . Su valor debe sustituirse después de la línea echo se expande, así que uso setlocal enableDelayedExpansion para habilitar signos de exclamación que amplían las variables en la ejecución. Y la ejecución sustituye a \ n con el contenido de nueva línea (busque la sintaxis en conjunto de ayuda ). Por supuesto, podríamos utilizar ! Newline! al configurar la respuesta pero \ n es más conveniente. Puede pasarse desde el exterior (intente Hello R2 \ nD2 ), donde nadie sabe el nombre de la variable que mantiene la línea (Sí, Hello C3! Newline! P0 funciona de la misma manera).

El ejemplo anterior puede ser refinado a una subrutina o lote independiente, usado como call: mlecho Hola \ nsoy tu 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 la secuencia de comandos analice \ n subcadena.

Puedes usar @echo (@echo + [espacio] + [espacio insegable])

Nota: el espacio insegable se puede obtener con Alt + 0160

Espero que ayude :)

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

No puedo hacerlo más simple que:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat

La forma más conservadora de caracteres para lograr esto en los sistemas linux, es con el alias -e , que interpreta los caracteres de escape que están en barra invertida.

echo -e "hello\nworld"

Aquí hay otros ejemplos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top