Перезаписать строку в командном файле Windows?
Перед тем, как что-то сказать, я попробовал этот код:
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"
set /p "=Example 1" <NUL
set /p "=!ASCII_13!Example 2" <NUL
Мой источник: Как перезаписать ту же строку в выводе команды из командного файла (проверенный ответ от него)
И это не сработало для меня. Это просто выводится как Example 1Example 2
когда я попробовал это.
Так что мне просто нужен способ перезаписать одну и ту же строку в командном файле (например, он сказал "Пример 1" раньше, но после этой строки вместо этого будет сказано "Пример 2").
Спасибо!
2 ответа
<nul set /p=text
это трюк, чтобы отобразить строку (текстовое приглашение) без перевода строки в конце, поэтому курсор останется на той же строке, и мы можем позже вернуться к началу строки (отправив возврат каретки), чтобы перезаписать ее.
Проблема, которую вы обнаружили с указанным ответом, заключается в изменении поведения в set /p
, До Windows XP, set /p
Команда смогла повторить пробелы в начале текстового приглашения, но из Vista белые символы удаляются из начала приглашения. Вы не можете отправить возврат каретки в начале строки. Но вы можете использовать его в другом месте
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
<nul set /p"=This is the line 1 !CR!"
<nul set /p"=This is the line 2 "
То есть вместо отправки CR
в начале строки отправьте ее в конце предыдущей строки.
Другим вариантом является включение другого символа в качестве начала текстового приглашения перед CR
, Включение видимого символа порождает другую проблему, так как он должен быть перезаписан в следующей строке, чтобы он не был виден. Backspace (ASCII 0x08
) является безопасным (обычно) вариантом
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
for /f %%a in ('"prompt $H&for %%b in (0) do rem"') do set "BS=%%a"
<nul set /p"=This is the line 1"
<nul set /p"=!BS!!CR!This is the line 2"
Начиная с windows 10 Treshold2 консоль понимает
Анси Escape Коды
Эти коды требуют escape-символа hex 0x1b или десятичного 27, который
трудно генерировать (зависит от вашего редактора)
Код для перехода к первому столбцу и n строк вверх ESC[nF
Код для удаления до конца строки: ESC[0J
Эти два кода вместе (одна строка):
esc [ 1 F esc [ 0 J
hex 1B 5B 31 46 1B 5B 30 4A
Эта партия использует certutil для декодирования шестнадцатеричной строки в ascii здесь
@echo off
echo 1B 5B>ESC.hex
Del ESC.bin >NUL 2>&1
certutil -decodehex ESC.hex ESC.bin >NUL 2>&1
Set /P ESC=<ESC.bin
set "Ansi=%ESC%1F%ESC%0J"
Echo line 1
Echo line 2
Echo line 3
Echo line 4
Timeout /t 3 >Nul
Echo %ESC%4F1st line
Timeout /t 1 >Nul
Echo 2nd line
Timeout /t 1 >Nul
Echo 3rd line
Timeout /t 1 >Nul
Echo 4th line
Echo New first Line extra long to see it's deleted, not overwritten
Timeout /t 3 >Nul
Echo %Ansi%Overwrite Line once
Timeout /t 2 >Nul
Echo %Ansi%Overwrite Line twice
Timeout /t 2 >Nul
Echo %Ansi%Overwrite Line thrice