1.%是個ESCAPE字元,通常將之譯為跳脫字元,但也有更形象的譯名脫逸字元、逃逸字元等。 也就是說%不僅僅將與其相關的特定字串轉義並替換為特定字串,而且自身也會被“脫逸”。 而且類似於C語言中的跳脫字元"\",雙%會轉義並脫逸為單%,四%則脫為雙%。
2.for本身是一個特殊的命令,類似於一個特化的命令直譯器,因為它的功能實現需要執行多條語句,因此它必須也具有對命令列(特指do後的命令列)分析處理的功能。 而command/cmd實現for時自然會借用自身原有的命令列分析模組,因此for具有二級轉義的特性,for中do後的語句被分兩級分析和解釋,第一級在command/cmd讀入並解釋for命令列時,第二級在for讀入並解釋do命令時,它通常會對同一命令列的進行多次解釋。
然後,我們可以注意到,在do中使用命令列引數變數和環境變數時,不需要雙%,那是因為,這些變數在經過第一級轉義後,被替換成特定的不變的字串常量,參與for迴圈的所有執行過程;而替代變數則要求在執行(do後的子命令列中)過程中不斷的動態變化,而這個變化自然仍需要透過脫逸字元來實現,因此使用雙%就是成了必然的選擇。
另外,還需要注意到,在命令列中使用for時不需要雙%,這源於命令直譯器對命令列與批處理的處理方式不同。 在早期的DOS版本中,%在命令列中不被視為跳脫字元,所以不會被轉義和脫逸,所以當時無法在命令列直接引用環境變數。
1.%是個ESCAPE字元,通常將之譯為跳脫字元,但也有更形象的譯名脫逸字元、逃逸字元等。 也就是說%不僅僅將與其相關的特定字串轉義並替換為特定字串,而且自身也會被“脫逸”。 而且類似於C語言中的跳脫字元"\",雙%會轉義並脫逸為單%,四%則脫為雙%。
2.for本身是一個特殊的命令,類似於一個特化的命令直譯器,因為它的功能實現需要執行多條語句,因此它必須也具有對命令列(特指do後的命令列)分析處理的功能。 而command/cmd實現for時自然會借用自身原有的命令列分析模組,因此for具有二級轉義的特性,for中do後的語句被分兩級分析和解釋,第一級在command/cmd讀入並解釋for命令列時,第二級在for讀入並解釋do命令時,它通常會對同一命令列的進行多次解釋。
然後,我們可以注意到,在do中使用命令列引數變數和環境變數時,不需要雙%,那是因為,這些變數在經過第一級轉義後,被替換成特定的不變的字串常量,參與for迴圈的所有執行過程;而替代變數則要求在執行(do後的子命令列中)過程中不斷的動態變化,而這個變化自然仍需要透過脫逸字元來實現,因此使用雙%就是成了必然的選擇。
另外,還需要注意到,在命令列中使用for時不需要雙%,這源於命令直譯器對命令列與批處理的處理方式不同。 在早期的DOS版本中,%在命令列中不被視為跳脫字元,所以不會被轉義和脫逸,所以當時無法在命令列直接引用環境變數。