我想写在一个窗口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