微剋多資訊

 找回密碼
 註冊

Sign in with google

Google帳號登入

搜索
12
返回列表 發新帖

該用戶從未簽到

升級   0%

11F
發表於 2016-9-4 12:03 | 只看該作者
jmsdhn 發表於 2016-9-4 10:02
set/?的解釋確實有說到用!來代替%了
在這個指令Setlocal EnableDelayedExpansion之後
%VAR%甚至等於 ...

在一個區段(block, 像是IF, FOR)裡面的敘述是先一起被解析(parsed)然後執行, 解析時你的變數其實還沒被執行更改.
(如果你執行前有設定過該變數, 應該就會看到前一次的結果)
所以要"延遲展開"才能獲得執行時更改的結果.

使用道具

該用戶從未簽到

升級   50.5%

12F
 樓主| 發表於 2016-9-4 12:50 | 只看該作者
似乎有點理解延遲的意思
把echo %VAR%寫在set VAR=after之後
竟然出現before而不是after
不過因為Setlocal EnableDelayedExpansion的關係
echo %VAR%還是有作用
只是他是IF外面的那個值


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

似乎又理解一層了
感謝

使用道具

該用戶從未簽到

升級   0%

13F
發表於 2016-9-4 14:29 | 只看該作者
jmsdhn 發表於 2016-9-4 12:50
似乎有點理解延遲的意思
把echo %VAR%寫在set VAR=after之後
竟然出現before而不是after

在像IF後面的block才會有差, 這樣表示應該比較好理解:
  1. @echo off
  2. Setlocal EnableDelayedExpansion

  3. set VAR=before
  4. echo %VAR%
  5. echo !VAR!

  6. echo --------------------

  7. set VAR=after
  8. echo %VAR%
  9. echo !VAR!

  10. echo --------------------

  11. set VAR=before
  12. if 1==1 (
  13.    set VAR=after
  14.    echo %VAR%
  15.    echo !VAR!
  16. )
複製代碼
1 0

使用道具

簽到天數: 1

該用戶今日未簽到

升級   77.78%

14F
發表於 2016-9-12 11:31 | 只看該作者
雖然已經解決了,不過來是提供建議....

set "var=value"
加上雙引號更活用!!

常常除錯的時候,發現加上雙引號就沒問題了

使用道具

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2024-4-20 07:49

Discuz! X

© 2009-2023 Microduo

快速回覆 返回頂部 返回列表