是否可以在批处理/ cmd中回显一些不可打印的字符?

时间:2014-01-26 18:32:41

标签: windows batch-file cmd carriage-return non-printing-characters

动机

我有一个第三方,不知何故长.bat文件是为某些特定功能编写的,并且需要花费相当大的努力来重写(我的问题也阻碍了这种努力)。在for循环中,调试它的最基本方法似乎是将一些信息回显到屏幕上。我以前用其他语言中的\r(0x0D)字符执行此操作,在某些终端/控制台上重写相同的行(以避免过度浮动,因为在我的情况下,最后一行将包含错误)。我已经将值保存到变量中。但是,由于迭代可能需要很长时间,我仍然乐意将一些输出写入不会过冲的屏幕。

我尝试了什么

  • 我知道我可以使用cmd回显echo.中的单个换行符 - 但我只需要回车
  • 我尝试了这些但是没有用:echo \recho ^recho \x0decho ^x0decho #0decho ^#0decho #x0decho ^x0d
  • 我试图duck the net在没有太多帮助的情况下尝试类似的东西

问题

是否有可能以某种方式回显windows / dos / nt / cmd批处理文件中的回车符(或其他不可打印的)字符?

PS。我使用的是XP或7 cmd处理器

4 个答案:

答案 0 :(得分:8)

你需要两个黑客 - 一个用于定义回车符,另一个用于回显一行文本而不发出换行符。

1)定义回车。

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

定义后,只能通过延迟展开来访问该值 - 例如!CR!,而不是%CR%

2)在不发出换行符的情况下将文字打印到屏幕上

<nul set /p "=Your message here"

如果字符串以=开头,则会失败。

此外,可能会删除引号和/或空格,具体取决于Windows版本

全部放在一起

@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!"

请注意,我将!CR!放在每封邮件的末尾以准备下一封邮件。你不能把!CR!放在开头,因为前面的空格会被剥离。

答案 1 :(得分:1)

沿线的某处,&#34; echo \&#34;用于打印[cr]行。非常适合结束其他命令的输出,这些命令不会将[cr]放在最后。 我已经将它用于将CR发送到文件,就像在IPconfig中一样找到&#34;回复&#34; &gt;&gt; myip.txt然后回显\&gt;&gt; myip.txt

答案 2 :(得分:1)

基于dbenham的帖子,我有以下几个在Win7中工作的例程,大部分都可以在记事本中编辑;但是,我使用Scite生成退格 ALT + 0 0 8 ,性格。它稍微不同,首先清除行,然后将光标放在文本的末尾。以下是例程:

: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的修改示例:

@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

复制上述脚本时,请确保保留 backspace 字符。

    SET "BS=backspace"

答案 3 :(得分:-1)

这是我在cmd中捕获&echo 0x0A的方法:

(
set n=^

)

然后进行测试:

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

您可能会通过十六进制查看器查看书面文件,例如fccomp

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

在Win 10 CMD中测试