动机
我有一个第三方,不知何故长.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批处理文件中的回车符(或其他不可打印的)字符?
PS。我使用的是XP或7 cmd处理器
答案 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
您可能会通过十六进制查看器查看书面文件,例如fc
或comp
00000000: 00 6C
00000001: 00 61
00000002: 00 0A
在Win 10 CMD中测试