¿Cuál es el equivalente por lotes de Windows del comando de shell de Linux echo -n
que suprime la nueva línea al final de la salida?
La idea es escribir en la misma línea dentro de un bucle.
windows
batch-file
cmd
newline
Gregseth
fuente
fuente
echo
podría soportarlo,-n
perocmd.exe
no funcionaría ^^echo
podría tomar-n
" en el contexto de una pregunta relacionada con Windows, es incorrecto.Respuestas:
Usando
set
y el/p
parámetro que puede hacer eco sin nueva línea:Fuente
fuente
<nul set /p =Hello
.set /p
no puede hacer eco de un signo igual como primer carácter ni espacios / pestañas.< nul
es una redirección desde elNUL
dispositivo. No contiene nada, pero eso es suficiente paraset /p
dejar de esperar la entrada del usuarioUsando:
echo | set /p=
o<NUL set /p=
ambos funcionarán para suprimir la nueva línea.Sin embargo, esto puede ser muy peligroso cuando se escriben scripts más avanzados cuando se comprueba que ERRORLEVEL se vuelve importante como configuración
set /p=
sin especificar un nombre de variable establecerá ERRORLEVEL en 1.Un mejor enfoque sería usar un nombre de variable ficticio como este:
echo | set /p dummyName=Hello World
Esto producirá exactamente lo que desea sin que ocurra ninguna cosa furtiva en segundo plano, ya que tuve que averiguarlo de la manera difícil, pero esto solo funciona con la versión canalizada;
<NUL set /p dummyName=Hello
aún elevará el ERRORLEVEL a 1.fuente
El método SET / P simple tiene limitaciones que varían ligeramente entre las versiones de Windows.
Las comillas principales pueden ser despojadas
El espacio en blanco inicial puede ser eliminado
El inicio
=
provoca un error de sintaxis.Consulte http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 para obtener más información.
jeb publicó una solución inteligente que resuelve la mayoría de los problemas en Texto de salida sin salto de línea, incluso con espacio inicial o = He refinado el método para que pueda imprimir de manera segura absolutamente cualquier cadena de lote válida sin la nueva línea, en cualquier versión de Windows desde XP en adelante. Tenga en cuenta que el
:writeInitialize
método contiene un literal de cadena que puede no publicarse bien en el sitio. Se incluye una observación que describe cuál debería ser la secuencia de caracteres.Los métodos
:write
y:writeVar
están optimizados de modo que solo las cadenas que contienen caracteres iniciales problemáticos se escriben usando mi versión modificada del método COPY de jeb. Las cadenas no problemáticas se escriben utilizando el método SET / P más simple y rápido.fuente
ECHO.
, excepto queECHO.
puede fallar en circunstancias oscuras . Hay un montón de otras formas que también pueden fallar en situaciones oscuras. El único que siempre funciona esECHO(
.Como un apéndice a la respuesta de @xmechanix, noté al escribir el contenido en un archivo:
Que esto agregará un espacio adicional al final de la cadena impresa , lo que puede ser un inconveniente, especialmente porque estamos tratando de evitar agregar una nueva línea (otro carácter de espacio en blanco) al final de la cadena.
Afortunadamente, citando la cadena a imprimir, es decir, usando:
Imprimirá la cadena sin ningún carácter de nueva línea o espacio al final.
fuente
World
y>
...set /p="abc"<nul|xxd -p
pantallas616263
mientras queset /p=abc<nul|xxd -p
da61626320
Una solución para el espacio en blanco eliminado en SET / P:
El truco es ese carácter de retroceso que puede invocar en el editor de texto EDITAR para DOS. Para crearlo en EDITAR, presione ctrlP + ctrlH . Lo pegaría aquí, pero esta página web no puede mostrarlo. Sin embargo, es visible en el Bloc de notas (es angosto, como un pequeño rectángulo negro con un círculo blanco en el centro)
Entonces escribes esto:
El punto puede ser cualquier carácter, solo está ahí para decirle a SET / P que el texto comienza allí, antes de los espacios, y no en el " Hola ". El " 9 " es una representación del carácter de retroceso que no puedo mostrar aquí. Debe ponerlo en lugar del 9, y eliminará el " . ", Después de lo cual obtendrá esto:
en vez de:
Espero que ayude
fuente
Puede eliminar la nueva línea usando "tr" de gnuwin32 ( paquete coreutils )
Por cierto, si está haciendo muchos scripts, gnuwin32 es una mina de oro.
fuente
trim
?\r
,\n
o\r\n
(Nuevas líneas en OSX, POSIX y Windows respectivamente) no son caracteres "espacio".Aquí hay otro método, utiliza Powershell Write-Host que tiene un parámetro -NoNewLine, combina eso
start /b
y ofrece la misma funcionalidad de lote.NoNewLines.cmd
Salida
Este a continuación es ligeramente diferente, no funciona exactamente como quiere el OP, pero es interesante porque cada resultado sobrescribe el resultado anterior emulando un contador.
fuente
y también para hacer eco a partir del uso de espacios
fuente
Tal vez esto es lo que estás buscando, es un guión de la vieja escuela ...: P
o tal vez estás tratando de reemplazar una línea actual en lugar de escribir en una nueva línea? puedes experimentar con esto eliminando el "% bs%" después del "." firmar y también espaciando el otro "% bs%" después del "Mensaje de ejemplo".
Encuentro esto realmente interesante porque usa una variable para un propósito diferente al que está destinado a hacer. como puede ver, "% bs%" representa un retroceso. El segundo "% bs%" usa el espacio de retroceso para agregar espacios después del "Mensaje de ejemplo" para separar la "Salida del comando Pausa" sin agregar realmente un carácter visible después del "Mensaje de ejemplo". Sin embargo, esto también es posible con un signo de porcentaje regular.
fuente
set nl=^& echo.
truco en todas partes y el nombre de la variable es engañoso. % nl% no es un carácter de nueva línea : se expande a&echo.
fin de que al final ejecute un nuevoecho
comando cada vez, de ahí la nueva línea. Puedes verlo por escritoecho "%nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%"
. Obtienes"& echo. The& echo. new& echo. line& echo. is& echo. not& echo. apparent& echo. throughout& echo. text& echo. "
, revelando el truco. El resultado es el mismo, pero no por las razones que sugiere.cw.exe
Utilidad de bricolaje (escritura de consola)Si no lo encuentra listo para usar, listo para usar, puede hacer bricolaje. Con esta
cw
utilidad puedes usar todo tipo de personajes. Al menos, me gustaría pensar que sí. Por favor, pruébelo y hágamelo saber.Herramientas
Todo lo que necesitas es .NET instalado, que es muy común hoy en día.
Materiales
Algunos caracteres escritos / copiados.
Pasos
.bat
archivo con el siguiente contenido.Ejecutarlo.
Ahora tiene una buena utilidad de 4KB para que pueda eliminar el
.bat
.Alternativamente, puede insertar este código como una subrutina en cualquier lote, enviar el resultado
.exe
a%temp%
, usarlo en su lote y eliminarlo cuando haya terminado.Cómo utilizar
Si quieres escribir algo sin nueva línea:
cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".
Si desea un retorno de carro (yendo al principio de la línea), ejecute solo
cw
Así que intente esto desde la línea de comando:
fuente
Hice una función de la idea de @arnep:
aquí está:
Úselo con
call :SL "Hello There"
Sé que esto no es nada especial, pero me tomó tanto tiempo pensar en eso que pensé que lo publicaría aquí.
fuente
Muestra 1: esto funciona y produce el código de salida = 0. Eso es bueno. Nota la "." , directamente después del eco.
Este es un mensaje mostrado como Linux echo -n lo mostraría ... 0
Muestra 2: esto funciona pero produce el código de salida = 1. Eso es malo. Tenga en cuenta la falta de ".", Después del eco. Esa parece ser la diferencia.
Este es un mensaje que se muestra como Linux echo -n lo mostraría ... 1
fuente
Inspirado por las respuestas a esta pregunta, hice un simple script de contador de lotes que sigue imprimiendo el valor de progreso (0-100%) en la misma línea (sobrescribiendo el anterior). Tal vez esto también sea valioso para otros que buscan una solución similar.
Observación :
*
son caracteres no imprimibles, estos deben ingresarse utilizando la combinación de teclas [Alt
+Numpad 0
+Numpad 8
], que es elbackspace
carácter.fuente
Creo que no hay tal opción. Alternativamente, puedes probar esto
fuente
Puede suprimir la nueva línea utilizando el comando set / p. El comando set / p no reconoce un espacio, para eso puede usar un punto y un carácter de retroceso para que lo reconozca. También puede usar una variable como memoria y almacenar lo que desea imprimir en ella, para que pueda imprimir la variable en lugar de la oración. Por ejemplo:
De esta forma, puede imprimir cualquier cosa sin una nueva línea. He hecho el programa para imprimir los caracteres uno por uno, pero también puedes usar palabras en lugar de caracteres cambiando el bucle.
En el ejemplo anterior utilicé "enabledelayedexpansion" para que el comando set / p no reconozca "!" carácter e imprime un punto en lugar de eso. Espero que no tengas el uso del signo de exclamación "!" ;)
fuente
Respuesta tardía aquí, pero para cualquier persona que necesite escribir caracteres especiales en una sola línea que encuentre que la respuesta de dbenham es aproximadamente 80 líneas demasiado larga y cuyos guiones pueden romperse (quizás debido a la entrada del usuario) bajo las limitaciones de simplemente usar
set /p
, Probablemente sea más fácil emparejar su .bat o .cmd con un ejecutable en lenguaje C ++ o C y luego solocout
oprintf
los caracteres. Esto también le permitirá escribir fácilmente varias veces en una línea si está mostrando una especie de barra de progreso o algo con caracteres, como aparentemente lo hizo OP.fuente
printf
ing desde uncmd
panel Win-7 me da"'printf' is not recognized as an internal or external command, operable program or batch file."
printf
No es nativo de Windows. Esta es una pregunta de Windows.