motivation
我有一个第三方,不知何故为某些特定功能编写了很长.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 处理器
您需要两个技巧 - 一个用于定义回车符,另一个用于在不发出换行符的情况下回显一行文本。
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中捕获和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 中测试