Mys*_*Hed 1 windows batch command-line batch-file cmd.exe
就在我说什么之前,我已经尝试过以下代码:
@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
Run Code Online (Sandbox Code Playgroud)
我的来源:如何覆盖批处理文件的命令输出中的同一行(来自它的验证答案)
这对我不起作用。它只是像Example 1Example 2
我尝试时那样输出。
所以我只需要一种方法来覆盖批处理文件中的同一行(例如,它之前说“示例 1”,但在该行之后会说“示例 2”)。
谢谢!
从 Windows 10 Treshold2 开始,控制台可以理解
Ansi 转义代码
这些代码需要难以生成的转义字符十六进制 0x1b 或十进制 27
(取决于您的编辑器)
转到第一列和 n 行的代码是ESC[nF
删除到行尾的代码是ESC[0J
这两个代码在一起(一行):
esc [ 1 F esc [ 0 J
hex 1B 5B 31 46 1B 5B 30 4A
Run Code Online (Sandbox Code Playgroud)
此批处理使用 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
Run Code Online (Sandbox Code Playgroud)
<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 "
Run Code Online (Sandbox Code Playgroud)
也就是说,不是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"
Run Code Online (Sandbox Code Playgroud)