2012-04-02 52 views
1

test.bat的內容是:爲什麼特定的Windows批處理參數會導致崩潰?

setlocal EnableExtensions EnableDelayedExpansion 
set param1=%~1 
echo %param1% 

有人能解釋爲什麼test.bat "^^!^^^&^^^^"使得cmd窗口崩潰,但test.bat "^^^&^^^^"有設置&^可變參數1的預期結果?

我可以做test.bat "pass^^!word",我得到pass!這個詞的預期結果。

更新:test.bat "^^!^^^^^&^^^^^^^^"的作品。但我不完全確定爲什麼。這被解釋爲set param1=^!^^&^^^^。爲什麼^在它前面需要^^^?

+1

發現可能是因爲當你'EnableDelayedExpansion'的'!'有着特殊的意義,你需要逃避它。 – adarshr 2012-04-02 17:56:33

回答

2

您遇到了很多問題,因爲在您的情況下特殊字符將被評估多次。

首先在set命令,特殊字符階段會減少你的字符串"^^!^^^&^^^^"
^!^&^^
但由於延遲擴充被啓用,你的字符串包含一個感嘆號,
另一個階段將被啓用,以減少插入符號再來。
!&^

此時param1包含!&^,你可以用set param1

測試,但你嘗試與另一echo %param1%擴張將被執行呼應的價值。
而現在你會得到一個問題,因爲%param1%將擴大到!&^
感嘆號將被刪除,作爲第二exlamation標記缺少擴展變量,
的符號將被視爲新命令分隔符
結束符將被視爲多行字符。
echo ! & ^<next line>

它是更安全的在這裏使用延遲擴展,這永遠不會改變的內容,因爲這階段是解析器的最後一個。

setlocal EnableDelayedExpansion 
set param1=%~1 
set param1 
echo !param1! 

而所有這些解釋可以在How does CMD.EXE parse scripts?

+0

非常感謝,幫助 – 2012-05-04 04:53:15

1

這是因爲Windows外殼程序轉義字符是^,所以:

「^^ ^^^^^ & ^^^^^^^^!」

每個^^變得^

每個^ &成爲&

所以最後你會得到:

「^ ^^ & ^^^^「

+0

不,他不會得到''^!^^&^^^^「',引號被'%〜1'中的波形符號去掉,並且更多的字符將被exlamation標記去除。 – jeb 2012-04-03 08:21:11

+0

但是隻有當他使用」EnableDelayedExpansion「時,...我認爲.. yes/no? – 2012-04-03 21:36:16

+0

是的,只有在EnabledDelayedExpansion和至少一個感嘆號在線上的任何位置,但插入符號在引號外部和內部進行評估時纔有效。'echo「^^^^」^^^^ x!'結果到'「^^」^ x' – jeb 2012-04-04 16:39:23

相關問題