我一直讨厌批处理,我仍然这样做,即使是最简单的事情,我更喜欢C或PHP / Perl。但这次我不能没有它,****叹气****。
我想将echo命令重定向到另一个命令。例如:
echo example | more
但我也希望能够在管道的回声部分使用特殊字符:
echo & | more
这当然没有用。所以我尝试过:
echo ^& | more
哪个也没用。然后通过反复试验我发现:
echo ^^^& | more
那很有效。但作为感兴趣的程序员我想知道为什么。为什么呢 ^& 不工作和 ^^^& 做?
原因与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管道时有许多细微的复杂情况。参考 为什么延迟扩展在管道代码块内部失败? 了解更多信息。所选答案具有最佳信息,但我建议阅读问题和所有答案以获取所选答案的上下文。
首先 ^ 正在逃避 ^ 人物本身(第二个 ^)和第三个 ^ 正在逃避 &。
当你运行像这样的命令 ECHO ^& | MORE, ^& 被替换为 & 在输出通过管道传输之前由shell MORE。
所以,当你跑步 ECHO ^^^& | MORE,shell取代了 ^^ 同 ^ 和 ^& 同 & 然后管道输出到 MORE。