문제

motivation

I have a 3rd party, somehow long .bat file written for some specific function and would take considerable effort to re-write (which effort is also hindered by my problem). In for loops the most basic way to debug it would seem echoing some information to the screen. I used to do this with \r (0x0D) character in other languages that on some terminals/console re-writes the same line (to avoid overflooding, since in my case the last line would contain the error). I already save the value to a variable. However, since iteration might take quite long, I'd still be happy to write some output to the screen that won't overflood.

what I've tried

  • I know I can echo a single newline in cmd with echo. - however I need only the carriage return
  • I've tried these but they did't work: echo \r, echo ^r, echo \x0d, echo ^x0d, echo #0d, echo ^#0d, echo #x0d, echo ^x0d
  • I've tried to duck the net for similar stuff without much help

question

Is it possible to somehow echo a carriage-return (or other non-printable) character in a windows/dos/nt/cmd batch file?

ps. I use the XP or the 7 cmd processor

도움이 되었습니까?

해결책

You need two hacks - one to define a carriage return character, and another to echo a line of text without issuing the newline character.

1) Define carriage return.

:: Define CR to contain a carriage return (0x0D)
for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A"

Once defined, the value can only be accessed via delayed expansion - as in !CR!, not %CR%.

2) Print text to the screen without issuing a newline

<nul set /p "=Your message here"

This will fail if the string starts with a =.

Also, leading quotes and/or white space may be stripped, depending on the Windows version

Putting it all together

@echo off
setlocal enableDelayedExpansion

:: Define CR to contain a carriage return (0x0D)
for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A"

<nul set/p"=Part 1 - press a key!CR!"
pause >nul
<nul set/p"=Part 2 - press a key!CR!"
pause >nul
<nul set/p"=Part 3 - Finished   !CR!"

Note that I put the !CR! at the end of each message in preparation for the next. You cannot put the !CR! at the beginning because leading white space will be stripped.

다른 팁

Somewhere along the line, "echo\" works to print a [cr] line. Great for ending an output from some other command that doesn't put [cr] at the end. I've used this for sending CR to files as in IPconfig | find "Reply" >>myip.txt and then echo\ >>myip.txt

Building on dbenham's post, I have the following routines that work in Win7 and mostly editable in Notepad; however, I used Scite to generate the backspace, ALT+008, character. It differs slightly by first clearing the row, and placing the cursor at the end of the text. Here are the routines:

:RECHO
<nul set/p"=backspace!CR!tabtabtabtabtabtabtabtabtabtab"
<nul set/p"=backspace!CR!%*"
GOTO :EOF
:NECHO
<nul set/p"=backspace!CR!tabtabtabtabtabtabtabtabtabtab"
ECHO backspace!CR!%*
GOTO :EOF

dbenham's example modified:

@ECHO OFF
SETLOCAL EnableDelayedExpansion

FOR /F %%a IN ('copy /Z "%~dpf0" nul') DO SET "CR=%%a"
SET "BS="

ECHO Testing CR. This line a regular echo ...
CALL :RECHO Part 1 - press a key
pause >nul
CALL :RECHO Part 2 - press a key
pause >nul
CALL :NECHO Part 3 - Finished
ECHO Testing CR. This line a regular echo ...
GOTO END

:RECHO
<nul set/p"=!BS!!CR!                                                "
<nul set/p"=!BS!!CR!%*"
GOTO :EOF

:NECHO
<nul set/p"=!BS!!CR!                                                "
ECHO !BS!!CR!%*
GOTO :EOF

:END
ENDLOCAL
EXIT /B

When copying the above script, make sure the backspace character is preserved.

    SET "BS=backspace"

Here's how I catch & echo 0x0A in cmd:

(
set n=^

)

Then to test:

echo Ila!n!you
echo Ila!n!!n!you
set /p="la!n!"<nul > newline

You may see the written file via hex viewer eg fc or comp

00000000: 00 6C
00000001: 00 61
00000002: 00 0A

Tested in Win 10 CMD

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top