我一直讨厌批处理,我仍然这样做,即使是最简单的事情,我更喜欢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
。