Jor*_*ori 12 cmd batch-file piping
我一直讨厌批处理,我仍然这样做,即使是最简单的事情,我更喜欢C或PHP/Perl.但这次我不能没有它,****叹气****.
我想将echo命令重定向到另一个命令.例如:
echo example | more
Run Code Online (Sandbox Code Playgroud)
但我也希望能够在管道的回声部分使用特殊字符:
echo & | more
Run Code Online (Sandbox Code Playgroud)
这当然没有用.所以我尝试过:
echo ^& | more
Run Code Online (Sandbox Code Playgroud)
哪个也没用.然后通过反复试验我发现:
echo ^^^& | more
Run Code Online (Sandbox Code Playgroud)
那很有效.但作为感兴趣的程序员我想知道为什么.为什么没有^&工作^^^&呢?
dbe*_*ham 10
原因与Windows如何实现管道有关 - 管道的每一侧都在自己的CMD shell中执行.您的命令echo ^& | more实际上尝试执行
C:\Windows\system32\cmd.exe /S /D /c" echo & "
Run Code Online (Sandbox Code Playgroud)
在左边和
C:\Windows\system32\cmd.exe /S /D /c" more "
Run Code Online (Sandbox Code Playgroud)
在右边.你可以看到为什么左侧失败 - 试图回应一个非转义的&.在执行实际左侧之前,初始解析阶段消耗了转义.
您也很容易理解为什么您的解决方案有效.左侧echo ^^^& | more成为
C:\Windows\system32\cmd.exe /S /D /c" echo ^& "
Run Code Online (Sandbox Code Playgroud)
使用Windows管道时有许多细微的复杂情况.请参阅为什么在管道代码块内部延迟扩展失败?了解更多信息.所选答案具有最佳信息,但我建议阅读问题和所有答案以获取所选答案的上下文.
第一个^是转义^字符本身(第二个^),第三个^是转义&。
当您运行类似 的命令时ECHO ^& | MORE,会在输出通过管道传送到 之前被 shell^&替换为。&MORE
因此,当您运行 时ECHO ^^^& | MORE,shell 会替换^^with^和^&with &,然后通过管道将输出传输到MORE.