windows - Dos/Windows 批量插入符号在 set/P 提示符下转义

标签 windows batch-file escaping character caret

我只是对 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/

相关文章:

java - 在 Windows 上无需管理员权限运行 Hadoop MR 作业

windows - 跟踪对 Delphi 中的文件夹所做的更改

windows - 导致应用程序加载缓慢的病毒扫描程序

c++ - EndDialog 与 DestroyWindow

for-loop - ffmpeg/for 循环 : How to make ffmpeg or cmd loop stops after it founds an error?

windows - 如何从文本文件执行cmd命令?

c - makefile 与批处理文件基本相同吗?

angularjs - 禁用 $sce 服务缺点

Java用'(撇号/单引号)和\(反斜杠)一起替换问题

php - mysql_real_escape_string 和单引号