簡體   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