繁体   English   中英

Windows cmd:echo 没有换行但有 CR

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM