Ce script fera exactement ce que vous avez demandé:
@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...
J'ai trouvé cette réponse en regardant le code dans une bibliothèque de manipulation de caractères de script batch écrite par Dave Benham appelée CharLib .
Cette bibliothèque est capable de créer tous les personnages dans la plage 1..255.
Pour plus d'informations, voir le fil de discussion intitulé "Est-il possible de convertir un caractère à sa valeur ASCII?"
Edit 2017-4-26: Il semble que le code ci-dessus ne fonctionne plus . Je ne sais pas quand ce comportement aurait changé, mais il fonctionnait définitivement. Le CR
personnage après le =
maintenant est supprimé par la set
commande. Ah, cela semble être un changement dans la façon dont set
fonctionne entre XP et les versions ultérieures de Windows. Voir l'excellente réponse dans la ligne Écraser dans le fichier de commandes Windows? (dupliquer) pour plus de détails et des exemples de code supplémentaires.
Une alternative consiste alors à mettre un caractère non blanc avant le !ASCII_13!
et à le supprimer également, peut-être soit en insérant également un espace arrière (qui ne sera pas supprimé) suivi d'un espace ou en ajoutant des espaces à la fin du chaîne d'invite (qui n'est pas supprimée.)
Par exemple, comme ceci:
@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
commande supprime maintenant tout Les caractères CR et LF (ainsi que les espaces) après le=
. Essayez de mettre un caractère non blanc entre le=
et le!ACSII_13!
set /p "=Step 2 " <NUL
Pour répondre à la question:
Production:
Fondamentalement, ce que le script fait, c'est d'écrire
Step 1
, puis remonte d'un endroit, écrase1
, et à la fin revient complètement et écraseStep 2
avecEnd
.Je reviens en arrière avec le caractère ASCII spécial 8 qui est le retour arrière. Parce que je ne sais pas comment l'écrire en cmd, j'utilise la fonction: EVALUATE qui exécute la fonction VBS Chr () et place le caractère de retour arrière dans la variable
result
. Si quelqu'un connaît un meilleur moyen, veuillez en informer.la source
$host.ui.RawUI.CursorPosition
dans une variable et la restaurer plus tard pour que le curseur revienne à l'endroit où vous vous trouviez et écrase votre sortie. Seulement une option pour PowerShell, mais peut être un peu plus propre que vos trucs VBS :-)EXPLICATION:
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
cela mettra le caractère de retour arrière dans la variable BSPACE. Maintenant, pour voir le résultat, tapez:
echo ab%BSPACE%c
production:
ac
vous pouvez utiliser cette variable BSPACE plusieurs fois pour supprimer plusieurs caractères.
Maintenant, si vous souhaitez définir un retour chariot dans une variable, utilisez
for /F "usebackq" %%a in (
copie / Z "% ~ dpf0" nul) DO (set "cr=%%a")
pour voir le résultat, tapez:
setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***
la sortie sera:
***asfasdhlfashflkashflksa
La réponse de @ davour ci-dessus est également belle mais la réponse de @ timfoden n'a pas fonctionné pour moi.
la source
set /p "=.!CR!End. " <NUL&echo:
Tu ne peux pas. Habituellement, vous pouvez réaliser ce genre de chose en incluant un caractère de retour chariot (0x0D) dans le fichier qui replacera le curseur dans la première colonne de la même ligne. Mais dans ce cas, cela ne fonctionne pas; le CR est mangé en silence.
De plus, obtenir le CR là-dedans est un peu délicat et au moins ici impliqué un éditeur de texte. Je vous suggère d'écrire un petit programme utilitaire qui fera cela pour vous, ce n'est en fait pas très difficile. Le petit programme C suivant peut suffire (si vous n'avez pas besoin d'Unicode):
Il ne fait rien de plus que d'imprimer un caractère CR, puis le texte que vous spécifiez comme premier argument. Utilisation comme suit:
La dernière ligne est l'appel à ce programme. La deuxième ligne est l'idiome de lot normal pour l'impression de texte sans rupture de ligne de fin (ce qui est important dans ce cas car sinon vous ne pourriez pas écraser la ligne). Vous pouvez tout aussi bien utiliser le programme ci-dessus à cet endroit.
Une manière légèrement hacky, mais la seule où vous pouvez être sûr où vous vous retrouvez, serait d'utiliser
cls
avant votre sortie pas à pas. Scintillera mais de cette façon, vous écrivez toujours en haut à gauche. Et clobber tout ce qui était visible dans la console (c'est pourquoi je ne le recommanderais pas); la plupart des utilisateurs n'aiment pas trop ça.la source
timeout 5
cela fonctionnera.for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
Obtenez le caractère de nouvelle ligne, écrivez l'étape suivante, revenez au début de la ligne, écrivez la ligne suivante:
la source
Step 1
Step 2
Step 3
tous sont de la même longueur. Sinon, le texte du premierset /p
reste. Je ne sais pas comment résoudre ce problème.set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
par opposition àset /p "=Step 2!Newline!" <NUL
. ÉchangezSPACE
contre le personnage.Vous auriez besoin d'une bibliothèque de curseurs d'écran comme
curses
ouncurses
, mais je ne connais pas trop leur utilisation. Les deux bibliothèques ont été développées pour les systèmes Unix, mais vous pouvez les trouver pour Windows (dans l' environnement Cygwin ou GnuWin32 ).Je ne connais aucun moyen facile d'y accéder dans un fichier batch de style DOS. Vous feriez peut-être mieux de programmer dans un langage compilé. Jetez un œil au Ncurses HOWTO pour avoir une meilleure idée de son utilité.
la source
Solution 1
Avec Notepad ++, il est possible d'insérer le Backspace ←caractère (ASCII 0x08) directement, en utilisant son panneau d'insertion de codes ASCII (Édition> Panneau de caractères).
Ma solution consiste à insérer le
[BS]
caractère directement puis, comme les autres solutions publiées ici, à l'utiliser plusieurs fois pour supprimer les caractères précédents:Code
Capture d'écran du Bloc-notes ++
Production
Solution 2
Une autre possibilité consiste à utiliser cecho (commande echo avec prise en charge des couleurs) pour insérer un Carriage Return ↵comme caractère unicode (U + 000D):
Code
NB:
cecho_x64.exe
tourne beaucoup plus vite sur ma machine quececho.exe
.la source