2014-04-04 80 views
4

有人能夠解釋cmd如何處理克拉,在下面的例子中?以變量名逃逸的字符

C:\>set ^^=test 

C:\>echo %^% 
test 

C:\>echo ^%^% 
test 

C:\>echo %^^% 
%^% 

我計算過,%^%會簡單地%%處理。我假設在考慮克拉之前處理變量擴展,然而這是對於我肯定可以更有說服力地解釋的問題的半回答。

在分批 -

@echo off 
set ^^=test 
echo %^% 
echo ^%^% 
echo %^^% 

-

C:\>test.bat 
test 
test 
ECHO is off. 

回答

3

這是因爲批量如何處理每個命令行的順序。簡而言之,在分析特殊字符之前執行可變擴展。這就是爲什麼克拉在被作爲轉義字符移除之前被變量擴展消耗掉的原因。這也是爲什麼百分號字符必須自己轉義%%而不是標準克拉^轉義字符。

相位/順序

1)相位(百分比):

  • %%由參數變量(%1%2等的單個%
  • 擴展替換)
  • 擴展%var%,如果var不存在替換i噸,沒什麼
  • 有關完整的說明,從dbenham閱讀本Same thread: percent expansion

1.5)從行刪除所有<CR>(回車符0X0D)

2)第二階段(特殊字符,"<LF>^&|<>()看看每個字符

  • 如果它是一個引號(")切換報價標誌,如果報價標誌有效,下列特殊字符不再特殊:^&|<>()
  • 如果是插入符號(^),則下一個字符沒有特殊含義,如果插入符號是該行的最後一個字符,則附加下一行,下一行的第一個字符爲始終處理爲轉義字符。
    • <LF>立即停止瞭解析,而不是在前面

一個插入符,對於一個完整的和很好的解釋在這裏看到的答案(認真收藏此鏈接!):

3

此外大衛Ruhrmann的答案...

您創建一個名爲^變量,解析器將難逃第二插入符號,並刪除在聲明set ^^=test第一個。

正如David解釋的那樣,百分比擴展階段是第一階段,因此它可以擴展奇怪的表達式,如<CR>字符,但這也是導致無法構建多行百分比擴展的原因。
首先百分比被擴大(並且因爲只有一個而失敗),然後使用多重線符號附加下一行。

echo %va^ 
r% 

但真正令人困惑的是下一個插入符例如

set "^=one caret" 
set "^^=two carets" 
echo "%^%" 
call echo "%%^%%" 

輸出是

"one caret" 
"two carets" 

這是因爲插入符號將由CALL

+0

+1加倍對於偉大解釋'set'命令,並添加與克拉的呼叫命令行爲。 –