12

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

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

echo example | more

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

echo & | more

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

echo ^& | more

这也不起作用。然后通过反复试验,我发现:

echo ^^^& | more

那行得通。但作为感兴趣的程序员,我想知道为什么。为什么没有^&工作并^^^&做到了?

4

2 回答 2

13

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

于 2012-06-25T17:17:02.437 回答
4

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

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

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

于 2012-06-25T17:16:07.017 回答