当我做某事时,我想写一些状态信息来替换最后一行。
在下面的示例 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 之间的工作方式的变化。请参阅=
set
set
覆盖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.