2012-02-23 47 views
0

PCAN誰能解釋爲什麼SET沒有在下面的代碼?:做任何事情Unworking SET在FOR/L的批處理腳本

ECHO OFF 
FOR /L %%b IN (-1,1,1) DO (
SET /A _lat=%%b 
ECHO variable lat: %_lat% 
ECHO variable b: %%b 
ECHO: 
) 

輸出:

variable lat: 
variable b: -1 

variable lat: 
variable b: 0 

variable lat: 
variable b: 1 

我嘗試沒有SET /當然,我試圖在FOR內變量%% b是一個文件中的字符串,它正常工作,但只是在這裏,當變量%% b是一個不斷變化的數字,它不起作用。

如果您有任何建議,請告訴我。當然,我可以用%% b來表示我想要的東西,但是由於這是大寫字母的一部分,爲了使它更具可讀性,我希望只能用於改變變量。

+0

相關問題:http://stackoverflow.com/questions/980718/cmd-for-loop-does-not-hold-set-a-value – 2012-02-23 14:20:54

回答

1

您需要使用ENABLEDELAYEDEXPANSION。試着用下面的:

setlocal ENABLEDELAYEDEXPANSION 

echo off 
for /L %%b in (-1,1,1) do (
    set /A _lat=%%b 
    echo variable lat: !_lat! 
    echo variable b: %%b 
    echo: 
) 
+0

thx,那正是:) – MasterPJ 2012-02-24 09:22:45

1

在控制檯中查看SET /?的輸出。您需要啓用並使用延遲環境變量擴展才能正常工作。下面是來自help set相關片段:

最後,對於延遲的環境變量擴展支持已經 增加。默認情況下,此支持始終處於禁用狀態,但可能通過將/ V命令行切換到CMD.EXE來啓用/禁用 。請參閱CMD /?

延遲的環境變量擴展對於獲取 當前擴展的侷限性非常有用,該擴展在讀取文本行 時發生,而不是在執行時發生。下面的示例 顯示了與即時變量擴展問題:

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "%VAR%" == "after" @echo If you see this, it worked 
) 

絕不會顯示該消息,因爲在這兩種IF語句 取代當第一IF語句被讀取,因爲它在邏輯上 包括%VAR% IF的主體,這是一個複合陳述。因此,如果在複合語句內部,IF「 」真的比較「之前」與 「之後」,這將永遠不會相等。同樣,預計下面的例子 將不起作用:

set LIST= 
for %i in (*) do set LIST=%LIST% %i 
echo %LIST% 
的是,它不會建立文件列表在當前目錄下,

而是將只設置LIST變量找到的最後一個文件。 同樣,這是因爲%LIST%僅在讀取FOR語句時擴展一次,並且此時LIST變量爲空。 所以,我們真正執行的循環是:

for %i in (*) do set LIST= %i 

這個循環繼續將LIST到找到的最後一個文件。

延遲的環境變量擴展允許您使用不同的 字符(感嘆號)來擴展環境變量,執行時間爲 。如果延遲變量擴充被啓用,上述 例子可以寫成如下,以工作打算:

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "!VAR!" == "after" @echo If you see this, it worked 
) 

set LIST= 
for %i in (*) do set LIST=!LIST! %i 
echo %LIST% 
+0

非常感謝你,我解決了這個問題。我不知道像「延遲的環境變量擴展」。所以下一次,我會真正閱讀幫助.. – MasterPJ 2012-02-24 09:20:31