命令解釋器是擴展環境變量的行爲大體以下:首先讀取命令行的一條完整語句,在進行一些先期的預處理以後,命令被解釋執行以前,會對其中用百分號閉合的字符串進行匹配,若是在環境空間中找到了與字符串相匹配的環境變量,則用其值替換掉原字符串及百分號自己,若是未獲得匹配,則用一個空串替換,這個過程就是環境變量的「擴展」,它仍然屬於命令行的預處理範疇。命令行
而一條「完整的語句」,在NT的命令解釋器CMD中被解釋爲「for if else」等含有語句塊的語句和用「& | && ||」等鏈接起來的複合語句。設計
所以,當CMD讀取for語句時,其後用一對圓擴號閉合的全部語句將一同讀取,並完成必要的預處理工做,這其中就包括環境變量的擴展,因此在for中的全部語句執行以前,全部的環境變量都已經被替換爲for以前所設定的值,從而成爲一個字符串常量,而再也不是變量。不管在for中將那些環境變量如何修改,真正受到影響的只是環境變量空間,而非for語句內部。字符串
而爲了可以在for語句內部感知環境變量的動態變化,CMD設計了延遲的環境變量擴展特性,也就是說,當CMD讀取了一條完整的語句以後,它不會當即執行變量的擴展行爲,而會在某個單條語句執行以前再進行擴展,也就是說,這個擴展行爲被「延遲」了。it
延遲環境變量擴展特性在CMD中缺省是關閉的,開啓它的方法目前有兩個:一是CMD /v:on,它會打開一個新的命令行外殼,在使用exit退出這個外殼以前,擴展特性始終有效,經常使用於命令行環境中;二是setlocal EnableDelayedExpansion,它會使環境變量的修改限制到局部空間中,在endlocal以後,擴展特性和以前對環境變量的修改將一同消失,經常使用於批處理語句中。io