Перезаписать строку в командном файле 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
Другие вопросы по тегам