2 回答

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

TA貢獻1794條經驗 獲得超8個贊
這是一個很好的信息,但我仍然在這里旋轉我的車輪。根據這個解釋,我希望這可以工作,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!
總是評估我第一次通過循環后的期望
添加回答
舉報