1

Перед тем, как что-то сказать, я попробовал этот код:

@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 ответа2

3

<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"
1

Начиная с 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 здесь

:: Q:\Test\2017\01\13\SU_1166580.cmd
@echo off
echo 1B 5B 31 46 1B 5B 30 4A>Ansi.hex
Del Ansi.bin
certutil -decodehex Ansi.hex Ansi.bin >NUL 2>&1
Set /P Ansi=<Ansi.bin

Echo First Line extra long to see it's deleted
Timeout /t 3 >Nul
Echo %Ansi%Second Line
Timeout /t 3 >Nul
Echo %Ansi%Third Line
Timeout /t 3 >Nul
Echo %Ansi%Fourth Line

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .