Windows cmd:回声没有新行,但与CR

我想写在一个窗口batch file中的循环内同一行。 例如:

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批处理:回声没有新行 ),但这将产生一个长行。

谢谢!

 @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命令的replaceable参数在不使用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