2012-06-25 43 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