Lote de Windows: echo sin nueva línea


¿Cuál es el equivalente de Windows batch del comando Linux shell 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.

Author: mklement0, 2011-08-18

16 answers

Usando set y el parámetro /p puede hacer eco sin nueva línea:

C:\> echo Hello World
Hello World

C:\> echo|set /p="Hello World"
Hello World
C:\>

Fuente

 188
Author: arnep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-11 04:22:01

Usando: 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 el NIVEL de error es importante, ya que establecer set /p= sin especificar un nombre de variable establecerá el nivel de error en 1.

Un mejor enfoque sería simplemente usar un nombre de variable ficticio como este:
echo | set /p dummyName=Hello World

Esto producirá exactamente lo que quieres sin ningún tipo de cosas furtivas pasando en el fondo como tuve que averiguar de la manera difícil, pero esto solo funciona con la versión canalizada; <NUL set /p dummyName=Hello todavía elevará el NIVEL de ERROR a 1.

 82
Author: xmechanix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-12 16:47:06

El método simple SET /P tiene limitaciones que varían ligeramente entre las versiones de Windows.

  • Las citas iniciales pueden ser eliminadas

  • El espacio en blanco inicial puede ser eliminado

  • Leading = causa un error de sintaxis.

Véase http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 para más información.

Jeb publicó una solución inteligente que resuelve la mayoría de los problemas en Texto de salida sin alimentación de línea, incluso con espacio inicial or = He refinado el método para que pueda imprimir con seguridad 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 método :writeInitialize contiene un literal de cadena que puede no publicarse bien en el sitio. Se incluye una observación que describe cuál debe ser la secuencia de caracteres.

Los métodos :write y :writeVar están optimizados de tal manera que solo las cadenas que contienen caracteres iniciales problemáticos se escriben usando mi versión modificada de método de copia de jeb. Las cadenas no problemáticas se escriben usando el método SET /P, más simple y rápido.

@echo off
setlocal disableDelayedExpansion
call :writeInitialize
call :write "=hello"
call :write " world!%$write.sub%OK!"
echo(
setlocal enableDelayedExpansion
set lf=^


set "str= hello!lf!world^!!!$write.sub!hello!lf!world"
echo(
echo str=!str!
echo(
call :write "str="
call :writeVar str
echo(
exit /b

:write  Str
::
:: Write the literal string Str to stdout without a terminating
:: carriage return or line feed. Enclosing quotes are stripped.
::
:: This routine works by calling :writeVar
::
setlocal disableDelayedExpansion
set "str=%~1"
call :writeVar str
exit /b


:writeVar  StrVar
::
:: Writes the value of variable StrVar to stdout without a terminating
:: carriage return or line feed.
::
:: The routine relies on variables defined by :writeInitialize. If the
:: variables are not yet defined, then it calls :writeInitialize to
:: temporarily define them. Performance can be improved by explicitly
:: calling :writeInitialize once before the first call to :writeVar
::
if not defined %~1 exit /b
setlocal enableDelayedExpansion
if not defined $write.sub call :writeInitialize
set $write.special=1
if "!%~1:~0,1!" equ "^!" set "$write.special="
for /f delims^=^ eol^= %%A in ("!%~1:~0,1!") do (
  if "%%A" neq "=" if "!$write.problemChars:%%A=!" equ "!$write.problemChars!" set "$write.special="
)
if not defined $write.special (
  <nul set /p "=!%~1!"
  exit /b
)
>"%$write.temp%_1.txt" (echo !str!!$write.sub!)
copy "%$write.temp%_1.txt" /a "%$write.temp%_2.txt" /b >nul
type "%$write.temp%_2.txt"
del "%$write.temp%_1.txt" "%$write.temp%_2.txt"
set "str2=!str:*%$write.sub%=%$write.sub%!"
if "!str2!" neq "!str!" <nul set /p "=!str2!"
exit /b


:writeInitialize
::
:: Defines 3 variables needed by the :write and :writeVar routines
::
::   $write.temp - specifies a base path for temporary files
::
::   $write.sub  - contains the SUB character, also known as <CTRL-Z> or 0x1A
::
::   $write.problemChars - list of characters that cause problems for SET /P
::      <carriageReturn> <formFeed> <space> <tab> <0xFF> <equal> <quote>
::      Note that <lineFeed> and <equal> also causes problems, but are handled elsewhere
::
set "$write.temp=%temp%\writeTemp%random%"
copy nul "%$write.temp%.txt" /a >nul
for /f "usebackq" %%A in ("%$write.temp%.txt") do set "$write.sub=%%A"
del "%$write.temp%.txt"
for /f %%A in ('copy /z "%~f0" nul') do for /f %%B in ('cls') do (
  set "$write.problemChars=%%A%%B    ""
  REM the characters after %%B above should be <space> <tab> <0xFF>
)
exit /b
 23
Author: dbenham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-18 21:07:20

Una solución para el espacio en blanco despojado en SET / P:

El truco es ese carácter de retroceso que puedes invocar en el editor de texto EDIT para DOS. Para crearlo en EDIT pulse CtrlP+ctrlH. Lo pegaría aquí, pero esta página web no puede mostrarlo. Sin embargo, es visible en el bloc de notas (es werid, como un pequeño rectángulo negro con un círculo blanco en el centro)

Así que escribe esto:

<nul set /p=.9    Hello everyone

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". Las "9" es una representación del carácter de retroceso que no puedo mostrar aquí. Tienes que ponerlo en lugar del 9, y borrará el " .", después de lo cual obtendrás esto:

    Hello Everyone

En lugar de:

Hello Everyone

Espero que ayude

 8
Author: Pedro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-25 04:12:49

Puede eliminar la nueva línea usando "tr" de gnuwin32 ( coreutils paquete)

@echo off
set L=First line
echo %L% | tr -d "\r\n"
echo Second line
pause

Por cierto, si estás haciendo muchas secuencias de comandos, gnuwin32 es una mina de oro.

 7
Author: BearCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-18 20:40:01

Como un anexo a la respuesta de @xmechanix, me di cuenta al escribir el contenido en un archivo:

echo | set /p dummyName=Hello World > somefile.txt

Que esto agregará un espacio adicional al final de la cadena impresa, lo que puede ser 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:

echo | set /p dummyName="Hello World" > somefile.txt

Imprimirá la cadena sin ningún carácter de nueva línea o espacio al final.

 7
Author: Joan Bruguera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-05 08:37:37

Aquí hay otro método, utiliza Powershell Write-Host que tiene un parámetro-NoNewLine, combínalo con start /b y ofrece la misma funcionalidad de batch.

NoNewLines.cmd

@ECHO OFF
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - ';Write-Host -NoNewLine 'Result 2 - ';Write-Host -NoNewLine 'Result 3 - '"
PAUSE

Salida

Result 1 - Result 2 - Result 3 - Press any key to continue . . .

Este de abajo es ligeramente diferente, no funciona exactamente como el OP quiere, pero es interesante porque cada resultado sobrescribe el resultado anterior emulando un contador.

@ECHO OFF
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 1 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 2 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 3 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 4 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 5 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 6 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 7 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 8 - '"
start /b /wait powershell.exe -command "Write-Host -NoNewLine 'Result 9 - '"
PAUSE
 5
Author: Knuckle-Dragger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-26 19:59:00

Tal vez esto es lo que buscas, es un guión de la vieja escuela... : P

set nl=^& echo. 
echo %nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%
echo only in prompt.
pause

O tal vez usted tratando de reemplazar una línea actual en lugar de escribir a una nueva línea? puede experimentar con esto eliminando el "%bs%" después del "."sign and also by spacing out the other" % bs% "after the"Example message".

for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "bs=%%a"
<nul set /p=.%bs%         Example message         %bs%
pause

Encuentro esto realmente interesante porque usa una variable para un propósito diferente a lo que está destinado a hacer. como puede ver el "% bs% " representa un retroceso. El el segundo " % bs% "usa el retroceso para agregar espacios después del" Mensaje de ejemplo "para separar la" salida del comando de pausa "sin realmente agregar un carácter visible después del"Mensaje de ejemplo". Sin embargo, esto también es posible con un signo de porcentaje regular.

 2
Author: zask,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 19:13:10

De aquí

<nul set /p =Testing testing

Y también para hacer eco a partir de espacios use

echo.Message goes here
 2
Author: Afdsafnadsjbcewjhwnfy4ntc874fg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-28 11:38:12

DIY cw.exe (consola de escritura) utilidad

Si no lo encuentras listo para usar, listo para usar, puedes hacerlo tú mismo. Con esta utilidad cw puede utilizar todo tipo de caracteres. Al menos, me gustaría pensar que sí. Por favor, pruébelo y hágamelo saber.

Herramientas

Todo lo que necesita es . NET instalado, que es muy común hoy en día.

Materiales

Algunos caracteres mecanografiados/copiados-pegados.

Pasos

  1. Crear .bat archivo con el siguiendo el contenido.
/* >nul 2>&1

@echo off
setlocal

set exe=cw
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.exe"') do set "csc=%%v"

"%csc%" -nologo -out:"%exe%.exe" "%~f0"

endlocal
exit /b %errorlevel%

*/

using System;

namespace cw {
    class Program {
        static void Main() {
            var exe = Environment.GetCommandLineArgs()[0];
            var rawCmd = Environment.CommandLine;
            var line = rawCmd.Remove(rawCmd.IndexOf(exe),exe.Length).TrimStart('"');
            line = line.Length < 2 ? "\r" : line.Substring(2) ;
            Console.Write(line);
        }
    }
}
  1. Ejecutarlo.

  2. Ahora tiene una buena utilidad de 4KB para que pueda eliminar .bat.

Alternativamente, puede insertar este código como una subrutina en cualquier lote, enviar el .exe resultante a %temp%, usarlo en su lote y eliminarlo cuando haya terminado.

Cómo usar

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 (ir al principio de la línea), ejecutar solo
cw

Así que prueba esto desde la línea de comandos:

for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw \&cw)
 2
Author: cdlvcdlv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 11:24:52

Puede suprimir la nueva línea usando el comando set /p. El comando set /p no reconoce un espacio, por lo que 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, de modo que pueda imprimir la variable en lugar de la oración. Por ejemplo:

@echo off
setlocal enabledelayedexpansion
for /f %%a in ('"prompt $H & for %%b in (1) do rem"') do (set "bs=%%a")
cls
set "var=Hello World! :)"
set "x=0"

:loop
set "display=!var:~%x%,1!"
<nul set /p "print=.%bs%%display%"
ping -n 1 localhost >nul
set /a "x=%x% + 1"
if "!var:~%x%,1!" == "" goto end
goto loop

:end
echo.
pause
exit

De esta manera puede imprimir cualquier cosa sin una nueva línea. He hecho el programa para imprimir los caracteres uno por uno, pero puedes usar palabras también en lugar de caracteres cambiando el bucle.

En el ejemplo anterior utilicé " enabledelayedexpansion "por lo que el comando set /p no reconoce"!"carácter e imprime un punto en lugar de eso. Espero que no tengas el uso del signo de exclamación "!" ;)

 1
Author: J.V.Raghava rama Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 17:56:20

Ejemplo 1: Esto funciona y produce el código de salida = 0. Eso Es Bueno. Nota el".", directamente después de echo.

C:\Users\phife.perro\gitrepos \ 1 \ repo_abc \ scripts #
@eco./set / p JUNK_VAR=Este es un mensaje mostrado como Linux echo-n lo mostraría ... & echo % ERRORLEVEL %

Este es un mensaje mostrado como Linux echo-n lo mostraría ... 0

Ejemplo 2: Esto funciona pero produce el código de salida = 1. Eso Es Malo. Por favor, tenga en cuenta la falta de ".", después de echo. Esa parece ser la diferencia.

C:\Users\phife.perro\gitrepos \ 1 \ repo_abc \ scripts #
@echo /set / p JUNK_VAR=Este es un mensaje mostrado como Linux echo-n lo mostraría ... & echo % ERRORLEVEL %

Este es un mensaje mostrado como Linux echo-n lo mostraría ... 1

 1
Author: user3175529,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-05 20:38:34

Creo que no hay tal opción. Alternativamente, puede probar esto

set text=Hello
set text=%text% world
echo %text%
 0
Author: m0skit0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-18 09:56:45

Respuesta tardía aquí, pero para cualquiera que necesite escribir caracteres especiales en una sola línea que encuentre que la respuesta de dbenham es de unas 80 líneas demasiado largas y cuyos scripts pueden romperse (quizás debido a la entrada del usuario) bajo las limitaciones de simplemente usar set /p, es probablemente más fácil emparejar su .bat or .cmd con un ejecutable compilado en C++ o C-language y luego solo cout o printf los caracteres. Esto también le permitirá escribir fácilmente varias veces en una línea si está mostrando un una especie de barra de progreso o algo así usando caracteres, como aparentemente fue OP.

 0
Author: SeldomNeedy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:26

Hice una función con la idea de @arnep:

Echo / set / p = "Hola Mundo"

Aquí está:

:SL (sameline)
echo|set /p=%1
exit /b

Utilícelo con call :SL "Hello There"
Sé que esto no es nada especial, pero me llevó tanto tiempo pensarlo que pensé en publicarlo aquí.

 0
Author: Mark Dodsons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-18 21:20:33

Puede usar el comando sustituto printf o print y usar retorno de carro en él para lograr esto

Ex: printf"Hello World\r"

La sintaxis completa está disponible aquí: http://wiki.bash-hackers.org/commands/builtin/printf

 -3
Author: Anonymous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-10 01:49:11