Este script hará exactamente lo que pediste:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"
set /p "=Step 1" <NUL
REM Do some stuff...
set /p "=!ASCII_13!Step 2" <NUL
REM do some other stuff...
Encontré esta respuesta mirando el código en una biblioteca de manipulación de caracteres de secuencia de comandos por lotes escrita por Dave Benham llamada CharLib .
Esta biblioteca puede crear todos los caracteres en el rango 1..255.
Para obtener más información, consulte el hilo titulado "¿Es posible convertir un carácter a su valor ASCII?"
Editar 2017-4-26: Parece que el código anterior ya no funciona . No estoy seguro de cuándo habría cambiado este comportamiento, pero definitivamente solía funcionar. El CR
personaje después del =
ahora es eliminado por el set
comando. Ah, parece ser un cambio en la forma en que set
funciona entre XP y versiones posteriores de Windows. ¿Ves la excelente respuesta en Sobrescribir línea en el archivo por lotes de Windows? (duplicado) para más detalles y ejemplos de código extra.
Entonces, una alternativa es colocar un carácter que no sea un espacio en blanco antes !ASCII_13!
y organizarlo para que también se borre, quizás insertando también un espacio de retroceso (que no se elimine) seguido de un espacio o agregando espacios al final del cadena de solicitud (que no se eliminan)
Por ejemplo, así:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"
set /p "=Step 1" <NUL
REM Do some stuff...
set /p "=x!ASCII_13!Step 2 " <NUL
REM do some other stuff...
set
comando ahora elimina cualquier Caracteres CR y LF (así como espacios) después de=
. Trate de poner un personaje no está en blanco entre el=
y el!ACSII_13!
set /p "=Step 2 " <NUL
Para responder la pregunta:
Salida:
Básicamente, lo que hace el guión es escribir
Step 1
, luego retrocede un lugar, sobrescribe1
y al final retrocede completamente y sobrescribeStep 2
conEnd
.Esto lo vuelvo a hacer con el carácter especial ASCII 8 que es retroceso. Como no sé cómo escribirlo en cmd, utilizo la función: EVALUATE que ejecuta la función VBS Chr () y coloca el carácter de retroceso en la variable
result
. Si alguien conoce una mejor manera, por favor avise.fuente
$host.ui.RawUI.CursorPosition
en una variable y restaurarla más tarde para que el cursor salte a donde estaba y sobrescriba su salida. Solo es una opción para PowerShell, pero puede ser un poco más limpio que sus cosas de VBS :-)EXPLICACIÓN:
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
esto establecerá el carácter de retroceso en la variable BSPACE. Ahora para ver el resultado, escriba:
echo ab%BSPACE%c
salida:
ac
Puede usar esta variable BSPACE más de una vez para eliminar varios caracteres.
Ahora, si desea establecer un retorno de carro en una variable, use
for /F "usebackq" %%a in (
copia / Z "% ~ dpf0" nul) DO (set "cr=%%a")
para ver el resultado, escriba:
setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***
la salida será:
***asfasdhlfashflkashflksa
La respuesta de @ davour anterior también es hermosa, pero la respuesta de @ timfoden no funcionó para mí.
fuente
set /p "=.!CR!End. " <NUL&echo:
No puedes Por lo general, puede lograr este tipo de cosas al incluir un carácter de retorno de carro (0x0D) en el archivo que colocará el cursor nuevamente en la primera columna de la misma línea. Pero en este caso no funciona; El CR se come en silencio.
Además, introducir el CR allí es un poco complicado y al menos aquí involucra un editor de texto. Te sugiero que escribas un pequeño programa de utilidad que haga esto por ti, en realidad no es muy difícil. El siguiente pequeño programa en C podría ser suficiente (si no necesita Unicode):
No hace más que imprimir un carácter CR y luego el texto que especifique como primer argumento. Uso de la siguiente manera:
La última línea es la llamada a ese programa. La segunda línea es el lenguaje de lote normal para imprimir texto sin un salto de línea final (lo cual es importante en este caso porque de lo contrario no podría sobrescribir la línea). Sin embargo, también podría usar el programa anterior en ese lugar.
Una manera un poco hacky, pero la única en la que puede estar seguro de dónde terminará, sería usarla
cls
antes de la salida de su paso. Parpadeará, pero de esa manera siempre escribes en la esquina superior izquierda. Y apunte todo lo que estaba visible en la consola (por eso no lo recomendaría); A la mayoría de los usuarios no les gusta demasiado.fuente
timeout 5
funcionará.for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
Obtenga el carácter de nueva línea, escriba el siguiente paso, regrese al inicio de la línea, escriba la siguiente línea:
fuente
Step 1
Step 2
Step 3
todos tienen la misma longitud. Si no,set /p
queda el texto del primero . No estoy seguro de como arreglar esto.set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
en lugar deset /p "=Step 2!Newline!" <NUL
. IntercambioSPACE
por el personaje.Necesitaría una biblioteca de cursor de pantalla como
curses
oncurses
, pero no estoy demasiado familiarizado con su uso. Ambas bibliotecas se desarrollaron para sistemas Unix, pero puede encontrarlas para Windows (en el entorno Cygwin o GnuWin32 ).No conozco ninguna forma fácil de acceder a ellos en un archivo por lotes de estilo DOS. Puede que sea mejor programar en un lenguaje compilado. Eche un vistazo al CÓMO de Ncurses para tener una mejor idea de si será útil.
fuente
Solución 1
Con Notepad ++ es posible insertar el Backspace ←carácter (ASCII 0x08) directamente, utilizando su Panel de inserción de códigos ASCII (Edición> Panel de caracteres).
Mi solución es insertar el
[BS]
carácter directamente y luego, como otras soluciones publicadas aquí, usarlo varias veces para eliminar caracteres anteriores:Código
Notepad ++ captura de pantalla
Salida
Solución 2
Otra posibilidad es usar cecho (comando echo con soporte de colores) para insertar un Carriage Return ↵carácter unicode (U + 000D):
Código
NB:
cecho_x64.exe
funciona significativamente más rápido en mi máquina quececho.exe
.fuente