¿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
echo Yes&echo No
¿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
echo Yes&echo No
Respuestas:
echo hello & echo.world
Esto significa que podría definir & echo.
como una constante para una nueva línea \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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 /
Utilizar:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
Con múltiples ecos, no funcionaría
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
y 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.
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.
set nl=^&echo.
, entonces solo echo hello %nl% world
produce el mismo efecto.
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
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.
ECHO(
falle.
echo
y cuáles son sus efectos?"
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%Line2
fallarí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 echo
que 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 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\
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.
call :pause line1!\n!line2
, inicie la subrutina con setlocal EnableDelayedExpansion
y setlocal DisableDelayedExpansion
termínela para evitar que las nuevas líneas se interpreten prematuramente.
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.
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 \n
uso en varios idiomas.
Descompostura
set n=
establece la variable n
igual 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
echo.
ya que primero intenta encontrar un archivo con ese nombre. Utilice otros signos de puntuación, comoecho,
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
(echo hello && echo world) > temp
mencionado por Nathan J. Brauer en un comentario a los trabajos de respuesta aceptados (actuales).
Tal como sugiere Grimtron, aquí hay un ejemplo rápido para definirlo:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
línea, no hay espacios entre ellas.
echo "Hello %newline% world"
falla ya que está dentro de las comillas. Porque no es una nueva línea real .
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)
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í :)
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.
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 . . .
echo asdf >myfile.txt
producirá exactamente los mismos resultados. echo
agrega una nueva línea al final de la cadena.
Para comenzar una nueva línea en lote, todo lo que tiene que hacer es agregar "echo [", así:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
es una mala solución.
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.
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
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.
ECHO ist eingeschaltet (ON).
una línea vacía, probé en el cmd-prompt
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.
echo hello \n world