批处理:用插入符号转义

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管道时有许多细微的复杂情况.请参阅为什么在管道代码块内部延迟扩展失败?了解更多信息.所选答案具有最佳信息,但我建议阅读问题和所有答案以获取所选答案的上下文.

  • +1,对我来说太快了,我可以添加任何东西 (2认同)

aph*_*ria 5

第一个^是转义^字符本身(第二个^),第三个^是转义&

当您运行类似 的命令时ECHO ^& | MORE,会在输出通过管道传送到 之前被 shell^&替换为。&MORE

因此,当您运行 时ECHO ^^^& | MORE,shell 会替换^^with^^&with &,然后通过管道将输出传输到MORE.

  • 你的第一段很适合[绕口令](https://en.wikipedia.org/wiki/Peter_Piper#Lyrics)... (3认同)