2 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個贊
我們將從一個簡單的案例開始
set "var="set "var=test" echo %var%
讀取代碼后,它會刪除變量的內(nèi)容,為其賦予一個新值并回顯它。
讓我們稍微改變最后兩個命令
set "var="set "var=test" & echo %var%
“相同”代碼,但在這種情況下,輸出到控制臺不會顯示變量中的值。
為什么?在批處理文件中,將解析然后執(zhí)行要執(zhí)行的行。在解析階段,每個變量讀取操作(在此處檢索變量的值)將替換為在解析時存儲在變量內(nèi)的值。完成此操作后,將執(zhí)行生成的命令。因此,在解析第二行的前一個示例中,它將轉(zhuǎn)換為
set "var=test" & echo
現(xiàn)在,線路上沒有讀取操作,沒有回顯值,因?yàn)楫?dāng)線路被加入時,變量沒有保存任何值(它將在執(zhí)行線路時分配),因此讀取操作已被替換為空。此時,執(zhí)行代碼并且感知到的行為是set
命令失敗,因?yàn)槲覀儧]有得到回顯到控制臺的“明顯”值。
在塊中也可以找到此行為。塊是括在括號中的一組行(通常for
和if
構(gòu)造),并由解析器處理,就像塊中的所有行只有一行具有連接命令一樣。重寫完整塊,刪除所有變量讀取操作并用變量內(nèi)部的值替換,然后執(zhí)行內(nèi)部沒有變量引用的完整塊。
在執(zhí)行時,對塊內(nèi)的變量沒有讀操作,只有其初始值,因此,在同一塊內(nèi)不能檢索分配給塊內(nèi)變量的任何值,因?yàn)闆]有任何讀操作。
所以,在這段代碼中
set "test=before"if defined test ( set "test=after" echo %test%)
在set
執(zhí)行第一個之后,if
將解析塊(命令和括號中包含的所有代碼)并將其轉(zhuǎn)換為
if defined test ( set "test=after" echo before)
顯示“錯誤”的價值。
處理它的常用方法是使用延遲擴(kuò)展。它可以讓你改變,在需要的地方,語法從讀可變%var%
進(jìn)!var!
,指示該讀操作不能在分析時被刪除,但推遲到執(zhí)行該命令的語法分析器。
setlocal enabledelayedexpansionset "var="set "var=test" & echo !var!
現(xiàn)在的第三行在解析時轉(zhuǎn)換為
set "var=test" & echo !var!
是的,不刪除變量引用。echo
當(dāng)變量的值已經(jīng)改變時,讀操作被延遲,直到執(zhí)行命令。
所以
%var%
是一個變量引用,將在分析時替換
!var!
是一個將在執(zhí)行時替換的變量引用
%x
與x
單個字符通常是一個for
可替換的參數(shù),將容納被interated當(dāng)前元素的變量。就其本身而言,將在執(zhí)行時擴(kuò)展。在命令行中使用帶有單個百分號的語法。在批處理文件內(nèi)部,需要轉(zhuǎn)義百分號,并且引用可替換參數(shù)的語法是%%x

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個贊
這是一個很好的信息,但我仍然在這里旋轉(zhuǎn)我的車輪。根據(jù)這個解釋,我希望這可以工作,setlocal EnableDelayedExpansion for /R /d %%f in (Product\Database\SQL\ICWProject\Model\Scripts\*) DO ( SET LOAD_FILE_FILTER=%%f\*.sql echo file: !LOAD_FILE_FILTER! server: %!SERVER_NAME% CALL %!BATCH_FILE% -s %!SERVER_NAME% -d %!DATABASE_NAME% -f !LOAD_FILE_FILTER! -u %!USER_NAME% -p %!PASSWORD% -o %!LOG_FILE% )
但!LOAD_FILE_FILTER!
總是評估我第一次通過循環(huán)后的期望
添加回答
舉報