Re: [問題] Dos AutoBatch
直接貼上set /?裡面的範例好了:
---
延遲環境變數展開功能可用來避開展開功能限制。這項限制是發生在命令列
讀取過程,不是發生在執行過程。下面的範例說明了立即展開變數時會發生
的問題:
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
if "%VAR%" == "after" @echo If you see this, it worked
)
這個例子永遠無法顯示 echo 訊息,因為在兩個 IF 敘述中的 %VAR% 會
在第一個 IF 敘述被讀入時便被展開。這是因為它是邏輯上包含了 IF 的內
部,而內部又是一個複合敘述。 所以在複合敘述內的 IF 實際上是用
"before" 和 "after" 來比較,而這永遠不會為真。同樣的,下面的例子也
不會作用:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
這個例子中並不會建立目前目錄中所有檔案的清單,相反的只會將 LIST 變
數設為最後一個找到的檔案。同樣地,這是因為 %LIST% 只有在 FOR 敘述
第一次被讀入時才展開,此時 LIST 變數是空的。所以我們實際執行的 FO
迴圈是:
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%
---
簡單說 你在一個指令裡用這種變數時
所有該展開的%...%是會一次展開的
那如果要讓它能夠在用到時才展開
那就用!...!來取用
你的for是一整條指令 所以在其中就需要用!...!來展開
就變成 set /a sum = !sum! + 1
不過這得要有啟用"延遲環境變數展開"功能才行
這可以用setlocal enabledelayedexpansion來設定
(詳見setlocal /?)
記得最後要endlocal還原
--
'You've sort of made up for it tonight,' said Harry. 'Getting the
sword. Finishing the Horcrux. Saving my life.'
'That makes me sound a lot cooler then I was,' Ron mumbled.
'Stuff like that always sounds cooler then it really was,' said
Harry. 'I've been trying to tell you that for years.'
-- Harry Potter and the Deathly Hollows, P.308
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.84.44.21
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章