我想在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
这将导致:
回复处理文件编号1
回复处理文件号2
回复处理文件编号3
。 。
我希望他们所有人都在同一条线上。 我找到了一个删除新行的黑客(例如:Windows batch: echo without new line),但这会生成一个长行。
谢谢!
答案 0 :(得分:7)
@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"
)
)
答案 1 :(得分:1)
感谢answer of 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
答案 2 :(得分:0)
以上内容在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