windows - usar - ¿Cómo puedes hacer eco de una nueva línea en archivos por lotes?
echo esta desactivado cmd (18)
¿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 salida:
Hola
mundo
Al igual que 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
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.
Como 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 este 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 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 especial de caracteres.
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 divididos en varias líneas en un archivo por lotes de Vista / DOS (.bat)
SO: ¿Cómo analiza los scripts el intérprete de comandos de Windows (CMD.EXE)?
Edición: evitar echo.
Esto no responde a la pregunta, ya que se trataba de un echo
único que puede generar varias líneas.
Pero a pesar de las otras respuestas que sugiere el uso del echo.
Para crear una nueva línea, hay que tener 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 una de
echo,
echo;
echo(
echo/
echo+
echo=
Pero el uso del echo.
, echo/
o echo:
debe evitarse, ya que pueden ser muy lentos, dependiendo de la ubicación donde se ejecutará el script, como una unidad de red.
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
Esto funcionó para mí, no es necesaria la expansión retrasada:
@echo off
(
echo ^<html^>
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause
Escribe salida así:
<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
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 salida de cmd:
@echo off
@echo line1
@echo:
@echo line2
Salida de citado encima del archivo cmd:
line1
line2
La forma más conservadora de caracteres para lograr esto en los sistemas Linux es con el alias -e
, que interpreta los caracteres escapados que son barras invertidas.
echo -e "hello/nworld"
Aquí hay otros examples
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 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
No puedo hacerlo más simple que:
echo echo hello^&echo world^&pause>silly.bat
call silly.bat
Para comenzar una nueva línea en lote, todo lo que tienes que hacer es agregar "echo [", así:
echo Hi!
echo[
echo Hello!
Puedes usar @echo
(@echo + [espacio] + [espacio insegable])
Nota: El espacio insegable se puede obtener con Alt + 0160
Espero eso 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 mal.
Si alguien viene aquí porque está buscando hacer eco de una línea en blanco de un makefile de MINGW, utilicé
@cmd /c echo.
simplemente utilizando echo.
hace que el dreaded process_begin: CreateProcess(NULL, echo., ...) failed.
mensaje de error.
Espero que esto ayude al menos a otra persona por ahí :)
Si necesita poner los resultados en un archivo, puede usar
(echo a & echo. & echo b) > file_containing_multiple_lines.txt
Si se necesita usar / n en los literales de cadena que se pueden pasar a una variable, puede escribir un código como en la siguiente secuencia de comandos Hello.bat :
@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 puede prepararse en un lugar, incluso en otro archivo o archivo externo, e imprimirse en otro.
El salto de línea se mantiene en la variable de nueva línea . Su valor debe sustituirse después de expandir la línea de eco, así que uso setlocal enableDelayedExpansion para habilitar signos de exclamación que expanden las variables en la ejecución. Y la ejecución sustituye a / n con contenidos de nueva línea (busque la sintaxis en el conjunto de ayuda ). Podríamos, por supuesto, usar ! Nueva línea! mientras se configura 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 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 la secuencia de comandos analice la subcadena.
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)
Utilizar:
echo hello
echo.
echo world
echo hello & echo.world
Esto significa que podrías definir & echo.
como una constante para una nueva linea /n
.
echo.
Basta de charla.
Si lo necesita en una sola línea, use la tecla &
. 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 sofisticado, ...
set n=^&echo.
echo hello %n% world
Salidas
hello
world
Luego simplemente agregue un %n%
cada vez que desee una nueva línea en una declaración de eco. Esto está más cerca de su /n
utilizado 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 gritar en voz alta), por lo que no se necesita &&
.
echo.
Continúa la declaración de eco.
Todo esto funciona porque realmente puedes crear variables que son código 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 hacer eco de una pestaña.
set t=^&echo. ::there are spaces up to the double colon