2010-11-04 12 views
7

He echado un vistazo a las preguntas anteriores de su base de datos y no intenté una respuesta, pero lo intento.Haciéndose eco en la misma línea

me gustaría escribir el siguiente código de líneas:

echo Executing backup.... 
backup procedure 
echo Ok 

pero la salida debe ser:

Executing backup... Ok 

eso es posible ?!

+1

¿En qué sistema operativo se encuentra? –

+0

sí, Windows Server 2003, se me olvidó ... – aemme

Respuesta

9

supongo que está utilizando DOS/NT-lote.

Es posible con el comando set/p, porque set/p no se imprime un CrLf

set /p "=Executing backup...." <nul 
echo OK 

También es posible borrar la línea con un carácter CR. Es importante saber que los caracteres en blanco en la parte frontal de un conjunto/p se ignoran (en Vista, no en XP), por lo que el! Cr! tiene que colocarse más tarde o al final. Un CR solo se puede mostrar con la expansión retrasada, porque% cr% funciona, pero los caracteres CR se eliminan en la fase de expansión porcentual (o directamente después de esta fase), pero no en la fase de expansión retardada.

Ejemplo de un contador que utilizan sólo una línea para la visualización de

@echo off 
setlocal EnableDelayedExpansion EnableExtensions 


call :CreateCR 
for /l %%n in (1,1,10000) do (
    set /P "=Count %%n!CR!" <nul 
) 
echo(
goto :eof 

:CreateCR 
rem setlocal EnableDelayedExpansion EnableExtensions 
set "X=." 
for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094! 

echo !X! > %temp%\cr.tmp 
echo\>> %temp%\cr.tmp 
for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do (
    endlocal 
    set cr=%%a 
    goto :eof 
) 
goto :eof 

EDIT: Explicación, cómo se crea la variable cr (hecho con un truco)

Después de ajustar la variable X a una solo punto (el personaje en sí no es importante), se repite para convertirse en 8188 caracteres por medio de for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094!

Luego la va riable, dos espacios y tanto una CR y LF se repiten en un archivo con echo !X! > %temp%\cr.tmp (Observe que los dos espacios entre el !X! y la > y los finales de línea natural de eco de reparar el daño interno)

Ahora tenemos 8192 caracteres, pero los datos el búfer solo puede contener 8191 caracteres, por lo que se eliminará el último carácter (el salto de línea).

En la siguiente línea echo\>> %temp%\cr.tmp, otro CR/LF conjunto se añade al archivo (el \ en el comando es sólo para la salida nada bar El retorno de carro y avance de línea, como echo por su propia voluntad salida ECHO is ON/OFF), eso es importante, como un solo CR no se puede leer al final de una línea (más adelante).

Así que el archivo contiene ahora <8188 .'s><SPACE><SPACE><CR><CR><LF>

El for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do lee el segundo modo, los delimters son el espacio estándar y pestaña, por lo que el segundo marcador es un solo CR, como la siguiente CR/LF se elimina como línea estándar final.

Finalmente el endlocal se utiliza para volver a un entorno sin las variables temporales X, c y a existente (igual que con el endlocal entre paréntesis, que permite el ajuste de cr antes de la endlocal realmente hace efecto al final de los soportes (también se podría escribir como for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do endlocal&set cr=%%a&goto :eof)

además

Esta fue mi primera forma de crear un carácter CR, pero necesita un poco de tiempo y un archivo temporal.
Más tarde vi un método más simple para recuperar el CR desde un comando copy /z.

for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 
+0

El primer ejemplo que escribió funciona perfetly. ¿Para qué es el signo aemme

+0

jeb

+0

Poner user66001

2

Prueba esto en el sistema POSIX (Linux)

echo -n "Executing backup.... " 
echo -n "backup procedure " 
echo "Ok" 

Es mucho más difícil en Windows. Usted tendrá que usar algo como esto:

@echo off 
echo|set /p ="Executing backup...." 
echo|set /p =" backup procedure" 

Comprobar este post: http://www.pcreview.co.uk/forums/showpost.php?s=1a20b16775d915998b30bd76a0ec5d35&p=4432915&postcount=7.

+0

Trabajo con Windows Server 2003 .... – aemme

+0

@Piotr Czapla - No creo que/después de cada conjunto (ejemplo de Windows) sea necesario, o al menos parece para trabajar lo mismo sin Sin embargo, al tratar de eliminarlos, alguien impidió la edición, por lo que tal vez esto sea incorrecto http://stackoverflow.com/questions/13665411/what-does-a-forward-slash-before-a-pipe-in-cmd- do-to-remove-the-line-ending-of-a # comment18755645_13665411. ¿Puedes aconsejar la necesidad de/¿? – user66001

+0

el conducto crea nuevas instancias cmd.exe se menciona en otro tema relacionado (ver mi respuesta) –

1

Es un poco un truco, pero aquí hay un article describing how to do it para Windows.

Desde el artículo, el resultado final (modificado para la configuración) tiene el siguiente aspecto:

SET /P var=Backing up 
%Result%....<NUL 

Backup_process %Result% >NUL 2>&1 

IF ERRORLEVEL 1 
    ECHO FAIL 
ELSE 
    ECHO OK 
+0

Muchas gracias, solo puedo aceptar 1 respuesta ...Lo veré – aemme

0

He hecho algo similar con un VBScript.

poner este código en EchoNoNewline.vbs:

If WScript.Arguments.Named.Exists("TEXT") Then 
    WScript.StdOut.Write WScript.Arguments.Named.Item("TEXT") 
End If 

Desde su archivo por lotes, utilice el script como el siguiente:

CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Executing backup...." 
backup procedure 
CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Ok" 
-1

en What does a forward slash before a pipe in cmd do to remove the line ending of an echo? la mejor sugerencia es:

para enviar un mensaje de texto sin un salto de línea es muy nefficient, ya que un conducto crea dos nuevas instancias de cmd.exe. Es mucho más sencillo y rápido de usar

 <nul set /p "=My Text" 

La redirección desde NUL también detendrá la espera de la entrada del usuario.

+0

¿Por qué alguien cree que esta respuesta no es útil? –

+0

Porque Llegan cuatro años tarde y tienen la misma solución que la respuesta aceptada. – SomethingDark

+0

¿En serio? Esa respuesta que envié aquí es de otro hilo. La respuesta aceptada aquí es un texto muy largo en su lugar –

Cuestiones relacionadas