web-dev-qa-db-ja.com

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」と表示されます)。

ありがとう!

1
MysteryBlokHed

<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の前にテキストプロンプトの先頭として別の文字を含めることです。表示されている文字を含めると、次の行で上書きされて表示されないため、別の問題が発生します。バックスペース(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"
4
MC ND

Windows 10 Treshold2以降、コンソールは理解します
Ansiエスケープコード
これらのコードには、エスケープ文字の16進数の0x1bまたは10進数の27が必要です。
生成が難しい(エディターによって異なります)

最初の列に移動してn行を並べるコードはESC[nF
行末まで削除するコードはESC[0J

これらの2つのコードを一緒に(1つ並べて):

    esc [ 1  F  esc [ 0  J  
hex 1B 5B 31 46 1B 5B 30 4A  

このバッチはcertutilを使用して、16進文字列をここで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
2
LotPings