2012-06-25 42 views
11

我一直讨厌批处理,即使对于最喜欢C或PHP/Perl的最简单的东西,我仍然会这样做。但是这次我不能没有它,****叹了口气。批处理:使用脱字符转义

我想将echo命令重定向到其他命令。例如:

echo example | more 

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

echo & | more 

这当然没有工作。所以我尝试过:

echo ^& | more 

哪个也没有工作。然后通过反复试验,我发现:

echo ^^^& | more 

和那个工作。但作为感兴趣的程序员,我想知道为什么为什么^&不工作,^^^&呢?

+1

我发现了这个,也许这对你有帮助? http://stackoverflow.com/questions/3813370/how-to-avoid-cmd-exe-interpreting-shell-special-characters-like – JohnP

+1

+1,全能一批即使你轻微的美丽,LOL 。据我所知,批次非常古怪,不一致,记录不完整。但是,我想这个挑战是为什么我有这么多的乐趣:-) – dbenham

+0

@dbenham,是否有任何企图在Windows上记录批处理语法? – Pacerier

回答

10

原因与Windows如何实现管道有关 - 管道的每一侧都在其自己的CMD外壳中执行。你的命令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管道时有许多微妙的复杂情况。欲了解更多信息,请参阅Why does delayed expansion fail when inside a piped block of code?。所选答案有最佳信息,但我建议您阅读问题和所有答案以获取所选答案的上下文。

+2

+1,对我来说太快了,而且没有什么可以加我 – jeb

+0

非常感谢您的帮助! – Jori

3

第一^被转义^字符本身(第二^)和第三^被逸出&

当您运行类似ECHO ^& | MORE的命令时,^&被shell替换为&,然后将输出传送到MORE

所以,当你运行ECHO ^^^& | MORE,外壳替换^^^^&&然后通过管道输出到MORE

+3

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