[英]Windows cmd: echo without new line but with CR
我想在 Windows 批处理文件的循环内的同一行上写。 例如:
setlocal EnableDelayedExpansion
set file_number=0
for %%f in (*) do (
set /a file_number+=1
echo working on file number !file_number!
something.exe %%f
)
setlocal DisableDelayedExpansion
这将导致:
echo 处理文件号 1
echo 处理文件号 2
echo 处理文件号 3
. . .
我希望他们所有人都在同一条线上。 我发现了一个删除新行的技巧(例如: Windows batch: echo without new line ),但这会产生一个长行。
谢谢!
@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%a in ('copy "%~f0" nul /z') do set "CR=%%a"
set "count=0"
for %%a in (*) do (
set /a "count+=1"
<nul set /p ".=working on file !count! !CR!"
)
第一个for
命令执行复制操作,在变量内留下一个回车符。
现在,在文件循环中,每一行都使用<nul set /p
,它将输出没有换行符和等待输入的提示字符串(我们正在从nul
读取)。 但是在回显的数据里面,我们包括了之前得到的回车。
但要使其工作, CR
变量需要与延迟扩展相呼应。 否则它将无法工作。
如果由于某种原因您需要禁用延迟扩展,则可以使用for
命令可替换参数在没有 CR 变量的情况下完成此操作
@echo off
setlocal enableextensions disabledelayedexpansion
for /f %%a in ('copy "%~f0" nul /z') do (
for /l %%b in (0 1 1000) do (
<nul set /p ".=This is the line %%b%%a"
)
)
感谢MC ND的回答,我创建了一个子程序echocr
,您可以在不延迟扩展的情况下调用它,它将回显一个只有回车符且没有换行符的字符串。 ( %input%
之后的空格被调整以覆盖所有以前的消息)。
您可以使用它来覆盖修改后的代码中所示的一行:
@echo off
call :echocr "good morning"
PING -n 2 127.0.0.1>nul
call :echocr "good afternoon"
PING -n 2 127.0.0.1>nul
call :echocr "bye now"
PING -n 2 127.0.0.1>nul
pause
:echocr
:: (echo string with carriage return, no line feed)
for /F "tokens=1 delims=# " %%a in (
'"prompt #$H# & echo on & for %%b in (1) do rem"'
) do set "backspace=%%a"
set input=%~1
set "spaces40= "
set "spaces120=%spaces40%%spaces40%%spaces40%
for /f %%a in ('copy "%~f0" nul /z') do (
set /p ".=*%backspace%%spaces120%%%a" <nul
set /p ".=*%backspace%%input%%%a" <nul
)
exit /b
以上不再适用于 Windows 7 及更高版本。 我发现原因是延迟扩展应该在ASCII_13 赋值之后设置,也许聪明的人可以解释为什么。
无论如何,下面的代码适用于 Windows 7 和 Windows 10。
@set licz=0
@setlocal
@for /f %%a in ('copy /Z "%~dpf0" nul') do @set "ASCII_13=%%a"
@setlocal enabledelayedexpansion
:loop
@set /a licz=licz+1
@set /p "=Waiting time: %licz% seconds!ASCII_13!" <NUL
@Timeout /T 1 /Nobreak > NUL
@GOTO loop
如果不喜欢光标在行首闪烁,则将 ASCII_13 转移到行首以在文本之前执行 CR。 但是,需要以任何 ASCII 字符开头,以避免被剥离。 这将作为行上的最后一个字符可见,所以在这里要小心:)
@set /p "=.!ASCII_13!Waiting time: %licz% seconds" <NUL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.