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



motivation

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

我尝试过什么

  • 我知道我可以在cmd中回显一个换行符echo.- 但是我只需要回车
  • 我试过这些,但它们不起作用:echo recho ^recho x0decho ^x0decho #0decho ^#0decho #x0decho ^x0d
  • 我试图在没有太多帮助的情况下躲避类似的东西

问题

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

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

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

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!放在开头,因为前导空格将被剥离。

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

基于dbenham的帖子,我有以下例程,这些例程在Win7中有效,并且在记事本中大部分都可以编辑;但是,我使用Scite生成了退格ALT+00 8字符。它略有不同,首先清除行,然后将光标放在文本的末尾。以下是例程:

:雷乔 退格!铬!标签标签退格!CR!%*" 转到 :EOF:
NECHO 退格!铬!标签标签回声退格!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

复制上述脚本时,请确保保留退格符。

设置"BS=退格键">

以下是我在cmd中捕获和echo0x0A的方式:

(
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 中测试

最新更新