如何覆盖批处理文件命令输出中的同一行

如何覆盖批处理文件命令输出中的同一行

当我做某事时,我想写一些状态信息来替换最后一行。

在下面的示例 bat 文件中,我希望文本在命令输出中的同一行上Step 2覆盖。Step 1

echo off

echo Step 1
REM Do some stuff...

echo Step 2
REM do some other stuff...

答案1

该脚本将准确执行您的要求:

@echo off

setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"

set /p "=Step 1" <NUL
REM Do some stuff...

set /p "=!ASCII_13!Step 2" <NUL
REM do some other stuff...

我通过查看 Dave Benham 编写的批处理脚本字符操作库中的代码找到了这个答案查库

该库能够创建 1..255 范围内的所有字符。

有关详细信息,请参阅标题为“是否可以将字符转换为其 ASCII 值?”

编辑2017-4-26: 上面的代码似乎不再起作用。我不确定这种行为何时会改变,但它肯定曾经有效。命令会删除 nowCR后面的字符。啊,这似乎是XP 和更高版本的 Windows 之间的工作方式的变化。请参阅=setset覆盖Windows批处理文件中的行?(重复)了解更多详细信息和额外的代码示例。

另一种方法是在前面放置一个非空白字符!ASCII_13!,然后安排它也被删除,也许可以通过插入一个退格键(不会被剥离)后跟一个空格或者在提示字符串的末尾附加空格(不会被剥离)。

例如这样:

@echo off

setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "ASCII_13=%%a"

set /p "=Step 1" <NUL
REM Do some stuff...

set /p "=x!ASCII_13!Step 2 " <NUL
REM do some other stuff...

答案2

回答这个问题:

@echo off
CALL :EVALUATE "chr(8)"
SET backspace=%result%
<nul set /p =Step 1
:: DO SOME STUFF....
<nul set /p =%backspace%
<nul set /p =2
:: DO SOME OTHER STUFF....
<nul set /p =%backspace%%backspace%%backspace%%backspace%%backspace%%backspace%
<nul set /p =End   
GOTO:EOF



:EVALUATE           -- evaluate with VBS and return to result variable
::                  -- %~1: VBS string to evaluate
:: extra info: http://groups.google.com/group/alt.msdos.batch.nt/browse_thread/thread/9092aad97cd0f917

@IF [%1]==[] ECHO Input argument missing & GOTO :EOF 

@ECHO wsh.echo "result="^&eval("%~1") > %temp%\evaluate_tmp_67354.vbs 
@FOR /f "delims=" %%a IN ('cscript //nologo %temp%\evaluate_tmp_67354.vbs') do @SET "%%a" 
@DEL %temp%\evaluate_tmp_67354.vbs
::ECHO %result%
@GOTO:EOF

输出:

End

基本上,脚本所做的就是写入Step 1,然后返回一个位置,覆盖1,最后完全返回并Step 2用覆盖End

我使用特殊的 ASCII 字符 8(即退格键)来执行此操作。因为我不知道如何在 cmd 中写入它,所以我使用 :EVALUATE 函数,该函数运行 VBS Chr() 函数,并将退格键字符放入变量中result。如果有人知道更好的方法,请提供建议。

答案3

@echo off
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"
<nul set /p =Step 1
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%
<nul set /p =2
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%
<nul set /p =3
ping 127.0.0.1 >nul
<nul set /p =%BSPACE%%BSPACE%%BSPACE%%BSPACE%%BSPACE%%BSPACE%
<nul set /p =End.  
pause

解释:

for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "BSPACE=%%a"

这会将退格符设置为 BSPACE 变量。现在要查看结果,请键入:

echo ab%BSPACE%c

输出: ac

您可以多次使用此 BSPACE 变量来删除多个字符。

现在,如果您想在变量中设置回车符,请使用

for /F "usebackq" %%a in (复制/Z“%〜dpf0” nul) DO (set "cr=%%a")

要查看结果,请输入: setlocal EnableDelayedExpansion & echo asfasdhlfashflkashflksa!CR!***

输出将是: ***asfasdhlfashflkashflksa

上面的@davour 的回答也很好,但是@timfoden 的回答对我来说没用。

答案4

获取换行符,写入下一步,返回行首,写入下一行:

@echo off
cls
setlocal enabledelayedexpansion
echo Here's how it's done:

for /f %%a in ('copy /Z "%~f0" nul') do set "Newline=%%a"
set /p "=Step 1!Newline!" <NUL
REM Do some stuff...
ping -n 2 localhost > nul
set /p "=Step 2!Newline!" <NUL
ping -n 2 localhost > nul
set /p "=Step 3 " <NUL
REM do some other stuff...
ping -n 2 localhost > nul
echo:
echo Done.

相关内容