6

动机

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

我试过的

  • cmd我知道我可以在其中回显一个换行符echo.- 但是我只需要回车
  • 我试过这些,但它们没有用:echo \r, echo ^r, echo \x0d, echo ^x0d, echo #0d, echo ^#0d, echo #x0d,echo ^x0d
  • 我试图在没有太多帮助的情况下上网寻找类似的东西

问题

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

附言。我使用 XP 或 7 cmd 处理器

4

4 回答 4

11

您需要两种技巧 - 一种用于定义回车符,另一种用于在不发出换行符的情况下回显一行文本。

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!每条消息的末尾以准备下一条。您不能将 the!CR!放在开头,因为前导空格将被删除。

于 2014-01-26T22:10:21.197 回答
1

在某处,“echo\”用于打印 [cr] 行。非常适合结束其他没有将 [cr] 放在末尾的命令的输出。我已经使用它来将 CR 发送到 IPconfig | 中的文件。找到“回复”>>myip.txt,然后回显\ >>myip.txt

于 2014-04-29T17:39:05.163 回答
1

基于 dbenham 的帖子,我有以下在 Win7 中工作的例程,并且大部分可以在记事本中编辑;但是,我使用 Scite 生成backspace, ALT+ 008, 字符。稍有不同的是,首先清除行,然后将光标放在文本的末尾。以下是例程:

:RECHO
<nul set/p"= backspace!CR! tabtabtabtabtabtabtabtabtabtab"
<nul set/p"= backspace!CR!%*"
转到:EOF
:NECHO
<nul set/p"= backspace!CR! tabtabtabtabtabtabtabtabtabtab"
回声backspace!CR!%*
转到: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保留字符。

    设置“BS = backspace
于 2015-03-19T14:22:26.183 回答
-1

这是我echo在 cmd 中捕获 & 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 中测试

于 2020-10-22T16:30:02.280 回答