Этот скрипт будет делать именно то, что вы просили:
@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...
Я нашел этот ответ, посмотрев код в библиотеке манипуляций с символами пакетного сценария, написанной Дэйвом Бенхэмом под названием CharLib .
Эта библиотека может создавать все символы в диапазоне 1..255.
Для получения дополнительной информации см. Ветку под названием «Можно ли преобразовать символ в его значение ASCII?»
Изменить 2017-4-26: похоже, что приведенный выше код больше не работает . Я не уверен, когда это поведение изменилось бы, но оно определенно работало. После этого CR
персонаж =
получает set
команду. Ах, похоже, это изменение способа set
работы между XP и более поздними версиями Windows. Смотрите отличный ответ в строке перезаписи в командном файле Windows? (дубликаты) для более подробной информации и дополнительных примеров кода.
Альтернативный вариант - поместить непробельный символ перед символом !ASCII_13!
и организовать его удаление, возможно, либо вставив клавишу возврата (которая не удаляется), затем пробел или добавив пробелы в конец строка подсказки (которая не удаляется)
Например, вот так:
@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
команда теперь удаляет любые Символы CR и LF (а также пробелы) после=
. Попробуйте поместить символ без пробелов между=
и!ACSII_13!
set /p "=Step 2 " <NUL
Чтобы ответить на вопрос:
Вывод:
В принципе, что делает скрипт, является запись
Step 1
, затем возвращается на одно место, перезаписывает1
, а в конце идет полностью назад и переписываетStep 2
сEnd
.Это возвращение я делаю со специальным символом 8 ASCII, который является backspace. Поскольку я не знаю, как написать это в cmd, я использую функцию: EVALUATE, которая запускает функцию VBS Chr () и помещает символ возврата в переменную
result
. Если кто-то знает лучший способ, пожалуйста, сообщите.источник
$host.ui.RawUI.CursorPosition
переменную и позже восстановить ее, чтобы курсор вернулся назад и перезаписал вывод. Только вариант для PowerShell, но может быть немного чище, чем ваш VBS :-)ОБЪЯСНЕНИЕ:
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
это установит символ возврата в переменную BSPACE. Теперь, чтобы увидеть результат, введите:
echo ab%BSPACE%c
вывод:
ac
Вы можете использовать эту переменную BSPACE более одного раза, чтобы удалить несколько символов.
Теперь, если вы хотите установить возврат каретки в переменной, используйте
for /F "usebackq" %%a in (
copy / Z "% ~ dpf0" nul) DO (set "cr=%%a")
чтобы увидеть результат, наберите:
setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***
вывод будет:
***asfasdhlfashflkashflksa
Ответ @ davour выше также красив, но ответ @ timfoden мне не помог.
источник
set /p "=.!CR!End. " <NUL&echo:
Ты не можешь Обычно этого можно добиться, включив в файл символ возврата каретки (0x0D), который вернет курсор к первому столбцу в той же строке. Но в этом случае это не работает; ЧР просто молча едят.
Кроме того, получить CR там довольно сложно и, по крайней мере, здесь задействован текстовый редактор. Я бы посоветовал вам написать небольшую утилиту, которая сделает это за вас, на самом деле это не очень сложно. Может пригодиться следующая маленькая программа на C (если вам не нужен Unicode):
Он не делает ничего, кроме печати символа CR, а затем текста, который вы указываете в качестве первого аргумента. Использование следующим образом:
Последняя строка - это вызов этой программы. Вторая строка - это обычная идиома для печати текста без разрывов задней строки (что важно в этом случае, потому что в противном случае вы не можете перезаписать строку). Вы можете также использовать вышеуказанную программу в этом месте.
Слегка хакерский способ, но единственный, в котором вы можете быть уверены, где вы окажетесь, - это использовать его
cls
перед выходным шагом. Будет мерцать, но вы всегда будете писать в верхнем левом углу. И ударить все, что было видно в консоли (поэтому я бы не рекомендовал это); большинству пользователей это не нравится.источник
timeout 5
будет работать.for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
Получить символ новой строки, написать следующий шаг, вернуться к началу строки, написать следующую строку:
источник
Step 1
Step 2
Step 3
они все одинаковой длины. Если нет, то текст первогоset /p
остается. Не уверен, как это исправить.set /p "=Step 2SPACESPACESPACESPACE!Newline!" <NUL
в отличие отset /p "=Step 2!Newline!" <NUL
. ОбменSPACE
на персонажа.Вам понадобится библиотека экранных курсоров, например
curses
илиncurses
, но я не слишком знаком с их использованием. Обе библиотеки были разработаны для систем Unix, но вы можете найти их для Windows (в среде Cygwin или GnuWin32 ).Я не знаю ни одного простого способа получить к ним доступ в пакетном файле в стиле DOS. Возможно, вам лучше программировать на скомпилированном языке. Взгляните на Ncurses HOWTO, чтобы лучше понять, будет ли это полезно.
источник
Решение 1
С помощью Notepad ++ можно вставлять Backspace ←символ (ASCII 0x08) напрямую, используя панель вставки кодов ASCII («Правка»> «Панель символов»).
Мое решение состоит в том, чтобы вставить
[BS]
символ напрямую, а затем, как и другие решения, опубликованные здесь, использовать его несколько раз для удаления предыдущих символов:Код
Скриншот Notepad ++
Вывод
Решение 2
Другая возможность - использовать cecho (команда echo с поддержкой цветов) для вставки Carriage Return ↵символа Юникод (U + 000D):
Код
NB:
cecho_x64.exe
на моей машине работает значительно быстрее, чемcecho.exe
.источник