我只是对 Windows 批处理中插入符转义的一个具体案例感到好奇:
请将以下代码保存为文件ttt.bat
,并在命令提示符下运行ttt.bat
,为什么我必须重复5次插入符号(还是克拉?)字符 ^
来制作这个 "no new line echo"把戏?我只想在回显字符串中放置一个管道 '|'
。
有一些关于 Windows 批处理转义的文档,但出于案例研究的目的,您能否解释一下此示例中使用的每个脱字符的含义?谢谢!
@echo off
SetLocal EnableDelayedExpansion
set foo=Hello world
set bar=Why why
echo|set /P=!foo! ^^^^^| !bar!
EndLocal
最佳答案
很明显:-)
这是 different phases of the parser涉及。
这里的第一个重要阶段是特殊字符阶段,插入符转义下一个字符,对于 ^|&<>
很重要。人物。
行会减少
echo|set /P=!foo! ^^^^^| !bar!
到
echo|set /P=!foo! ^^| !bar!
随着一个插入符号从下一个符号中逸出,最后一个插入符号从管道中逸出。
这里的下一个重要阶段是延迟扩展阶段,此阶段仅在至少一个 !
时发生。正在排队。
在此阶段,插入符也会转义下一个字符,但这里只需要插入符本身和 !
。 ,并且在这个阶段延迟变量被扩展。
来自
echo|set /P=!foo! ^^| !bar!
到
echo|set /P=Hello world ^| Why why
当您在这里使用管道时,管道的两边都将被转移到一个新的 cmd.exe 进程,并在那里再次解析命令。
cmd.exe /c "echo"
和 cmd /c "set /P=Hello world ^| Why why
只有 set /P=Hello world ^| Why why
现在是相关的。
同样在特殊字符阶段,一个插入符号将管道字符转义为
set /P=Hello world | Why why
延迟扩展阶段不会发生,首先是因为延迟扩展在新的 cmd.exe 中被禁用(默认情况下),其次是因为没有任何 !
。在行中。
就这样!
顺便说一句。
在这里生成两个进程不是必需的,重定向更简单、更快
<nul set /P=!foo! ^^^| !bar!
没有延迟扩展,你只需要一个插入符
<nul set /P=FOO ^| BAR
或者看看区别 设置本地启用延迟扩展
echo "carets ^^^"
echo "carets ^^^" !
关于windows - Dos/Windows 批量插入符号在 set/P 提示符下转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38259717/