Dieses Skript macht genau das, was Sie gefragt haben:
@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...
Ich fand diese Antwort, indem ich mir den Code in einer von Dave Benham geschriebenen Batch-Skript-Zeichenmanipulationsbibliothek namens CharLib ansah .
Diese Bibliothek kann alle Zeichen im Bereich 1..255 erstellen.
Weitere Informationen finden Sie im Thread mit dem Titel "Ist es möglich, ein Zeichen in seinen ASCII-Wert zu konvertieren?"
Edit 2017-4-26: Es scheint, dass der obige Code nicht mehr funktioniert . Ich bin mir nicht sicher, wann sich dieses Verhalten geändert hätte, aber es hat definitiv funktioniert. Das CR
Zeichen nach dem =
Jetzt wird vom set
Befehl entfernt. Ah, es scheint eine Änderung in der Funktionsweise set
zwischen XP und späteren Windows-Versionen zu sein. Sehen Sie die hervorragende Antwort in der Zeile Überschreiben in der Windows-Batchdatei? (Duplikat) für weitere Details und zusätzliche Codebeispiele.
Eine Alternative besteht dann darin, ein Nicht-Leerzeichen vor das zu setzen !ASCII_13!
und dafür zu sorgen, dass es auch gelöscht wird, möglicherweise entweder durch Einfügen eines Rückzeichens (das nicht entfernt wird) gefolgt von einem Leerzeichen oder durch Anhängen von Leerzeichen an das Ende des Eingabeaufforderungszeichenfolge (die nicht entfernt werden.)
ZB so:
@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
Befehl jetzt alle entfernt CR- und LF-Zeichen (sowie Leerzeichen) nach dem=
. Versuchen Sie, ein Nicht-Leerzeichen zwischen das=
und das!ACSII_13!
set /p "=Step 2 " <NUL
Um die Frage zu beantworten:
Ausgabe:
Grundsätzlich schreibt das Skript,
Step 1
geht dann eine Stelle zurück, überschreibt1
und überschreibt am Ende vollständig und überschreibtStep 2
mitEnd
.Dies gehe ich mit dem speziellen ASCII-Zeichen 8 zurück, das die Rücktaste ist. Da ich nicht weiß, wie man es in cmd schreibt, verwende ich die Funktion: EVALUATE, mit der die Funktion VBS Chr () ausgeführt wird, und füge das Rücktastezeichen in die Variable ein
result
. Wenn jemand einen besseren Weg kennt, beraten Sie bitte.quelle
$host.ui.RawUI.CursorPosition
in einer Variablen speichern und später wiederherstellen, damit der Cursor an die Stelle zurückspringt, an der Sie sich befanden, und Ihre Ausgabe überschreibt. Nur eine Option für die Powershell, aber vielleicht ein bisschen sauberer als Ihre VBS Sachen sein :-)ERLÄUTERUNG:
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
Dadurch wird das Rücktastezeichen in die BSPACE-Variable gesetzt. Geben Sie nun Folgendes ein, um das Ergebnis anzuzeigen:
echo ab%BSPACE%c
Ausgabe:
ac
Sie können diese BSPACE-Variable mehrmals verwenden, um mehrere Zeichen zu löschen.
Wenn Sie jetzt einen Wagenrücklauf in einer Variablen festlegen möchten, verwenden Sie
for /F "usebackq" %%a in (
copy / Z "% ~ dpf0" nul) DO (set "cr=%%a")
Geben Sie Folgendes ein, um das Ergebnis anzuzeigen:
setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***
Die Ausgabe lautet:
***asfasdhlfashflkashflksa
Die Antwort von @ davour oben ist auch wunderschön, aber die Antwort von @ timfoden hat bei mir nicht funktioniert.
quelle
set /p "=.!CR!End. " <NUL&echo:
Das kannst du nicht. Normalerweise können Sie dies erreichen, indem Sie ein Wagenrücklaufzeichen (0x0D) in die Datei aufnehmen, wodurch der Cursor wieder auf die erste Spalte in derselben Zeile gesetzt wird. Aber in diesem Fall funktioniert es nicht; Die CR wird nur still gegessen.
Darüber hinaus ist es etwas schwierig, die CR dort hinein zu bringen, und zumindest hier ist ein Texteditor beteiligt. Ich würde vorschlagen, dass Sie ein kleines Hilfsprogramm schreiben, das dies für Sie erledigt. Es ist eigentlich nicht sehr schwer. Das folgende kleine C-Programm könnte ausreichen (wenn Sie keinen Unicode benötigen):
Es wird lediglich ein CR-Zeichen und dann der von Ihnen als erstes Argument angegebene Text gedruckt. Verwendung wie folgt:
Die letzte Zeile ist der Aufruf dieses Programms. Die zweite Zeile ist die normale Stapelsprache zum Drucken von Text ohne Zeilenumbruch (was in diesem Fall wichtig ist, da Sie die Zeile sonst nicht überschreiben könnten). Sie können das obige Programm aber auch an dieser Stelle verwenden.
Ein leicht hackiger Weg, aber der einzige, bei dem Sie sicher sein können, wo Sie landen, ist die Verwendung
cls
vor Ihrer Schrittausgabe. Flackert aber so schreibst du immer nach links oben. Und alles blockieren, was in der Konsole sichtbar war (weshalb ich es nicht empfehlen würde); Die meisten Benutzer mögen das nicht so sehr.quelle
timeout 5
wird es funktionieren.for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
Holen Sie sich das Zeilenumbruchzeichen, schreiben Sie den nächsten Schritt, kehren Sie zum Zeilenanfang zurück und schreiben Sie die nächste Zeile:
quelle
Step 1
Step 2
Step 3
alle gleich lang sind. Wenn nicht,set /p
bleibt der Text des ersten erhalten . Ich bin mir nicht sicher, wie ich das beheben soll.set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
im Gegensatz zuset /p "=Step 2!Newline!" <NUL
. Tauschen SieSPACE
gegen den Charakter.Sie würden eine Bildschirm-Cursor-Bibliothek wie
curses
oder benötigenncurses
, aber ich bin mit deren Verwendung nicht allzu vertraut. Beide Bibliotheken wurden für Unix-Systeme entwickelt, aber Sie können sie für Windows finden (in der Cygwin-Umgebung oder GnuWin32 ).Ich kenne keine einfache Möglichkeit, in einer Batch-Datei im DOS-Stil darauf zuzugreifen. Sie sind möglicherweise besser dran, in einer kompilierten Sprache zu programmieren. Schauen Sie sich das Ncurses HOWTO an, um eine bessere Vorstellung davon zu bekommen, ob es nützlich sein wird.
quelle
Lösung 1
Mit Notepad ++ ist es möglich, das Backspace ←Zeichen (ASCII 0x08) direkt über das Einfügefeld für ASCII-Codes (Bearbeiten> Zeichenfeld) einzufügen .
Meine Lösung besteht darin, das
[BS]
Zeichen direkt einzufügen und es dann wie andere hier veröffentlichte Lösungen mehrmals zu verwenden, um vorherige Zeichen zu löschen:Code
Notepad ++ Screenshot
Ausgabe
Lösung 2
Eine andere Möglichkeit besteht darin, cecho (Echo-Befehl mit Farbunterstützung ) zu verwenden, um Carriage Return ↵ein Unicode-Zeichen (U + 000D) einzufügen:
Code
NB:
cecho_x64.exe
Läuft auf meinem Computer deutlich schneller alscecho.exe
.quelle