Windows cmd:没有新行但使用CR的echo

时间:2014-09-10 18:58:59

标签: windows batch-file cmd

我想在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),但这会生成一个长行。

谢谢!

3 个答案:

答案 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