2013-07-17 51 views
2

最新消息?蝙蝠文件,函數和插入符號

helper.bat

@echo off 
echo %1 
call:foo %1 
goto:eof 

:foo 
echo %1 
goto:eof 

運行我們像下面

助手腳本 「^^^^」

輸出

「^^^^」

「^^^^^^^^」

爲什麼?我知道'^'符號在cmd.exe的情況下是特殊的,但是這裏發生了什麼?函數調用如何影響它?

回答

3

CALL在這種情況下是非常特殊的!

批解析器有不同的階段,在特殊字符階段未加引號插入符號用於逃避下一個字符,插入符本身被刪除。
在你的情況下,插入符號被引用,所以它們不會受到影響。

然後,在延遲擴展階段,插入符號可能會再次受到影響,但引號在那裏沒有特殊含義,插入符號僅用於避免感嘆號。

通常延遲階段完成後,但如果您使用CALL所有插入是加倍
通常這是不可見的,因爲CALL也會重新啓動解析器,並且再次在特殊字符階段中刪除插入符號。
但在你的情況下,他們被引用,因此他們保持倍增。

試試這個

call call call call echo a^^ "b^" 

輸出

a^ "b^^^^^^^^^^^^^^^^" 

解析器在How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+0

解釋是它記錄的行爲使用像水木清華 「的號召:FOO %% 1」,而不是「呼:foo%1「? – FrozenHeart

+0

是的,這是標準的技術,以獲得更多的解析階段,通常在括號中很有用,如'call set line = %% line:abc = def %%' – jeb

+0

因此,我可以使用這個技巧避免重複'^'符號?你知道我可以在MSDN中閱讀嗎? – FrozenHeart