¿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
windows
batch-file
newline
Brian R. Bondy
fuente
fuente
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
.fuente
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:
fuente
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 luegoecho 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:
Debería ver una salida como la siguiente:
Solo necesita el código entre las declaraciones REM, obviamente.
fuente
set nl=^&echo.
, entonces soloecho 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:Salida del archivo cmd citado anteriormente:
fuente
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.
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 queecho.
es lo peor, ya que es muy lento y puede fallar por completo, ya que cmd.exe busca un archivo llamadoECHO
e intenta iniciarlo.Para imprimir solo una línea vacía, puede usar uno de
Pero el uso de
echo.
,echo\
oecho:
debería evitarse, ya que pueden ser realmente lentos, dependiendo de la ubicación donde se ejecutará el script, como una unidad de red.fuente
call :pause line1!\n!line2
, inicie la subrutina consetlocal EnableDelayedExpansion
ysetlocal 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ícarosecho.
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,saldría como:
Ahora, digamos que quieres algo un poco más elegante, ...
Salidas
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 variablen
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
fuente
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:
fuente
(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:
Salida
fuente
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 .Si necesita poner resultados a un archivo, puede usar
fuente
También puedes hacer así,
La salida será,
Tenga en cuenta que cuando esto se coloca en un archivo por lotes, '%' se duplicará.
fuente
*
charSi 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 temidoprocess_begin: CreateProcess(NULL, echo., ...) failed.
mensaje de error.Espero que esto ayude al menos a otra persona por ahí :)
fuente
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:
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
:Tenga en cuenta que la barra diagonal inversa adicional no impedirá que el script analice \ n subcadena.
fuente
Esto funcionó para mí, no es necesaria una expansión tardía:
Escribe una salida como esta:
fuente
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í:
fuente
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:
fuente
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.
fuente
ECHO ist eingeschaltet (ON).
una línea vacía, probé en el cmd-promptEsta solución funciona (probado):
Esto convierte los avances de línea aislados en una combinación de avance de línea de retorno de carro.
fuente
echo hello \n world
No puedo hacerlo más simple que:
fuente