Question

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

Was it helpful?

Solution

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.

OTHER TIPS

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top