【问题标题】:Is it possible to echo some non-printable characters in batch/cmd?是否可以在批处理/cmd 中回显一些不可打印的字符?
【发布时间】:2014-01-26 18:32:41
【问题描述】:

动机

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

我的尝试

  • 我知道我可以用echo.cmd 中回显一个换行符 - 但是我只需要回车
  • 我已经尝试过这些,但它们没有用:echo \recho ^recho \x0decho ^x0decho #0decho ^#0decho #x0decho ^x0d
  • 我已经尝试duck the net 寻求类似的东西,但没有太多帮助

问题

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

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

【问题讨论】:

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


【解决方案1】:

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

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! 放在开头,因为前导空格会被删除。

【讨论】:

  • 啊-我是如此接近。我的解决方案不起作用,因为我有 !cr!在字符串的开头。谢谢你的解释。 +1
  • CR hack 的文档:它依赖于 /Z switch of copy 的特定行为。关于`%~dfp0",见Using batch file parameters
  • 如果我在打印消息时不知道是否需要在没有 CR 的情况下继续打印怎么办?是否有机会针对单独打印!CR! 或使用一些非标准空格(例如chr(160) + CR)做一些变通方法以仅在真正需要时才允许使用CR?
【解决方案2】:

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

【讨论】:

  • 不,输出 &lt;CR&gt;&lt;LF&gt;(回车和换行),但 OP 只寻找 &lt;CR&gt;
  • 赞成:不是 OP 的问题,但非常有用(我一直在寻找这个)。
  • OP 问题是“回显回车(或其他不可打印)字符”
【解决方案3】:

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

:RECHO 退格键!CR!tabtabtabtab 标签标签标签标签标签标签" 退格!CR!%*" 转到:EOF :NECHO 退格键!CR!tabtabtabtab 标签标签标签标签标签标签" ECHO 退格!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

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

SET "BS=退格"

【讨论】:

    【解决方案4】:

    这是我在 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 中测试

    【讨论】:

    • 覆盖最后一行,LF 根本没有帮助。你需要CR。问题不在于回显换行符,而是一次又一次地(过度)写入同一行。
    • @Stephan:“问题”部分中的问题是“以某种方式回显回车(或其他不可打印)字符”。在开始对其他人的答案进行投票之前,请阅读问题,尤其是。如果你自己想不出答案!
    • 回车符 (CR) 将光标设置在当前行的开头。换行符 (LF) 将光标设置到下一行。不同的东西(是的,我读了这个问题......)。并且有几个很好的答案,那么我为什么要用类似的答案来混乱这个页面呢?顺便说一句,您不应该默认情况下认为反对票一定来自评论者(在这种情况下是这样,但大多数情况下并非如此)。
    • @Stephan:CRLF 不同。你知道从 CMD 到echo“不可打印”的任何其他方式吗?随意分享。 (没有任何外部,当然最好没有 JS、HTA、VBS 或下载)
    • Dbenham 列出了大量方法here
    猜你喜欢
    • 2012-10-01
    • 2023-01-15
    • 2010-12-15
    • 2010-11-15
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多