问题 批处理:用插入符号转义


我一直讨厌批处理,我仍然这样做,即使是最简单的事情,我更喜欢C或PHP / Perl。但这次我不能没有它,****叹气****。

我想将echo命令重定向到另一个命令。例如:

echo example | more

但我也希望能够在管道的回声部分使用特殊字符:

echo & | more

这当然没有用。所以我尝试过:

echo ^& | more

哪个也没用。然后通过反复试验我发现:

echo ^^^& | more

那很有效。但作为感兴趣的程序员我想知道为什么。为什么呢 ^& 不工作和 ^^^& 做?


11218
2018-06-25 16:52


起源

我发现了这个,也许这对你有帮助吗? stackoverflow.com/questions/3813370/... - JohnP
+1,即使你轻微的全能批次之美,LOL。我知道批次非常古怪,不一致,并且记录不足。但后来我想挑战是为什么我有这么多的乐趣:-) - dbenham
@dbenham,是否有任何尝试从Windows记录批处理语法? - Pacerier
@Pacerier - stackoverflow.com/q/4094699/1012053 - dbenham


答案:


原因与Windows如何实现管道有关 - 管道的每一侧都在自己的CMD shell中执行。你的命令 echo ^& | more 实际上是试图执行

C:\Windows\system32\cmd.exe /S /D /c" echo & "

在左边和

C:\Windows\system32\cmd.exe /S /D /c" more "

在右边。你可以看到为什么左侧失败 - 试图回应一个未转义的 &。在执行实际左侧之前,初始解析阶段消耗了转义。

您也很容易理解为什么您的解决方案有效。左侧 echo ^^^& | more 变

C:\Windows\system32\cmd.exe /S /D /c" echo ^& "

使用Windows管道时有许多细微的复杂情况。参考 为什么延迟扩展在管道代码块内部失败? 了解更多信息。所选答案具有最佳信息,但我建议阅读问题和所有答案以获取所选答案的上下文。


10
2018-06-25 17:17



+1,对我来说太快了,我可以添加任何东西 - jeb
非常感谢您的回答! - Jori


首先 ^ 正在逃避 ^ 人物本身(第二个 ^)和第三个 ^ 正在逃避 &

当你运行像这样的命令 ECHO ^& | MORE^& 被替换为 & 在输出通过管道传输之前由shell MORE

所以,当你跑步 ECHO ^^^& | MORE,shell取代了 ^^ 同 ^ 和 ^& 同 & 然后管道输出到 MORE


3
2018-06-25 17:16



你的第一段对a有好处 绕口令... - Pacerier