Re: [問題] Dos AutoBatch

看板Programming作者 (IWH68S0XZ8M89)時間18年前 (2008/02/01 17:18), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串6/8 (看更多)
直接貼上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
文章代碼(AID): #17ekFTCm (Programming)
文章代碼(AID): #17ekFTCm (Programming)