windows - comando - echo salto de linea batch
Windows cmd: echo sin lĂnea nueva pero con CR (2)
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in (''copy "%~f0" nul /z'') do set "CR=%%a"
set "count=0"
for %%a in (*) do (
set /a "count+=1"
<nul set /p ".=working on file !count! !CR!"
)
El primer comando ejecuta una operación de copia que deja un carácter de retorno de carro dentro de la variable.
Ahora, en el bucle de archivo, cada línea se repite utilizando un <nul set /p
que generará la cadena de solicitud sin un salto de línea y sin esperar la entrada (estamos leyendo desde nul
). Pero dentro de los datos repetidos, incluimos el retorno de carro obtenido anteriormente.
PERO para que funcione, la variable CR
debe repetirse con la expansión retrasada. De lo contrario, no funcionará.
Si por alguna razón necesita desactivar la expansión retardada, esto puede hacerse sin la variable CR utilizando el parámetro for
replaceable
@echo off
setlocal enableextensions disabledelayedexpansion
for /f %%a in (''copy "%~f0" nul /z'') do (
for /l %%b in (0 1 1000) do (
<nul set /p ".=This is the line %%b%%a"
)
)
Me gustaría escribir en la misma línea dentro de un bucle en un archivo de lote de Windows. Por ejemplo:
setlocal EnableDelayedExpansion
set file_number=0
for %%f in (*) do (
set /a file_number+=1
echo working on file number !file_number!
something.exe %%f
)
setlocal DisableDelayedExpansion
Esto dará como resultado:
echo trabajando en el archivo número 1
echo trabajando en el archivo número 2
echo trabajando en el archivo número 3
. . .
Me gustaría que todos estén en la misma línea. Encontré un truco para eliminar la nueva línea (por ejemplo, aquí: Windows batch: echo sin línea nueva ), pero esto producirá una línea larga.
¡Gracias!
Gracias a la respuesta de MC ND he creado una subrutina, echocr
, que puede llamar sin demora de expansión, que hará eco de una cadena con solo un retorno de carro, y sin nueva línea. (Los espacios después de %input%
se ajustan para cubrir todos los mensajes anteriores).
Puede usarlo para sobreescribir una línea como se muestra en el código modificado:
@echo off
call :echocr "good morning"
PING -n 2 127.0.0.1>nul
call :echocr "good afternoon"
PING -n 2 127.0.0.1>nul
call :echocr "bye now"
PING -n 2 127.0.0.1>nul
pause
:echocr
:: (echo string with carriage return, no line feed)
for /F "tokens=1 delims=# " %%a in (
''"prompt #$H# & echo on & for %%b in (1) do rem"''
) do set "backspace=%%a"
set input=%~1
set "spaces40= "
set "spaces120=%spaces40%%spaces40%%spaces40%
for /f %%a in (''copy "%~f0" nul /z'') do (
set /p ".=*%backspace%%spaces120%%%a" <nul
set /p ".=*%backspace%%input%%%a" <nul
)
exit /b