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