Este tema se basa en un comportamiento extraño (lo llamaría un error) que ocurre cuando TAB (ASCII char 9) se combina con BS (ASCII char 8) en los comandos ECHO o SET /P.
Cuando se muestra un carácter TAB en la pantalla, el controlador de pantalla de Windows lo traduce a una serie de espacios en blanco (generalmente 8 ), por lo que en este caso el TAB es destructivo: cualquier texto que se muestra previamente en la pantalla se sobrescribe con los espacios cuando se muestra TAB.
El número de espacios varía según la posición del cursor cuando se muestra el TAB, por lo que la posición final del cursor después de los espacios siempre es múltiplo de 8. Por ejemplo, si el cursor está en la primera columna de una línea, se muestra un TAB como 8 espacios, pero si el cursor está en la columna 1, el TAB se muestra como 7 espacios, etc.
Un comportamiento que puede parecer lógico en un principio es que un carácter de BS que se muestra después del TAB mueve el cursor hacia atrás la misma cantidad de espacios que muestra el TAB, es decir, la BS elimina la acción del TAB. Lo que en mi humilde opinión es un error es que otra BS que se muestra después de la primera también mueve el cursor hacia atrás la misma cantidad de espacios y, si el cursor alcanza el margen izquierdo de la pantalla, el cursor se desplaza hasta el final de la línea de pantalla anterior. !
Por ejemplo, si el cursor está en la primera columna de una línea, una secuencia de caracteres <TAB><BS><BS> mueve el cursor una línea arriba y 7 columnas a la izquierda del margen derecho de la pantalla. Si la pantalla tiene 80 caracteres de ancho, cada grupo adicional de 10 caracteres BS mueve el cursor una línea más. Después de eso, cada carácter BS adicional mueve el cursor 8 caracteres más a la izquierda en la misma línea. Finalmente, si se muestra otro carácter estándar único, los siguientes caracteres BS moverán el cursor solo un carácter a la izquierda.
De esta manera, el cursor se puede colocar en cualquier línea y columna anterior en la pantalla simplemente calculando el número adecuado de caracteres BS para mostrar después de una TAB y después de un carácter estándar adicional. Si la posición deseada está por debajo de la posición actual del cursor, primero coloque el cursor en la parte inferior de la pantalla a través de varios comandos ECHO/, y luego mueva el cursor hacia arriba y hacia la izquierda hasta la ubicación deseada con este método.
El archivo por lotes a continuación es un ejemplo del procedimiento anterior. El cálculo de la cantidad de caracteres BS y el comando ECHO es realmente simple y se puede agregar a cualquier programa de una manera muy simple, pero este programa es grande y complejo porque muestra una pantalla llena de coordenadas y permite ingresar la posición. de varias marcas, que se mostrarán en la pantalla en las posiciones adecuadas.
Código
@echo off setlocal EnableDelayedExpansion echo/ echo/ rem Get a BEL, BS and a TAB characters set "BEL=" set "TAB=" rem First, try the method for Windows XP rem Then, the method for newer versions rem http://www.dostips.com/forum/viewtopic.php?f=3&t=1733&p=6840#p6853 rem Get a string with 162 BS characters, the maximum used in this program set "BSs=" mode 80,32 set "line1=" set "line2=" set "line3=" set "twoORthree=23" ) set /A "l+=1" ) ) ) rem Initialize cursor position at middle of screen, to read input there set "currLine=16" set "letters=_ABCDEFGHIJKLMNOPQRSTUVWXYZ" set "num=1" :loop set "position=" goto loop ) rem New position above: move cursor up and show point call :MoveCursorupAndShow "(currLine-y-1)" x "!letters:~% style="color: #448888;">num%,1!(% style="color: #448888;">y%,%x%)" rem And move cursor down, back to original input line set /A down=currLine-y-2, cntBSup+=10 rem New position below: first, move cursor to last line rem Then, move cursor up and show point call :MoveCursorupAndShow "(30-y)" x "!letters:~% style="color: #448888;">num%,1!(% style="color: #448888;">y%,%x%)" rem And move cursor up, back to original input line, using the same method set /A down=30-y ) set /A num+=1 :end cls goto :EOF :MoveCursorupAndShow Linesup Column "Text" set "BSsLeft=" exit /B
La siguiente imagen es un ejemplo de salida del código anterior después de que se mostraran 8 marcas en varias posiciones.
por @Antonio en dostips