Rolen 發問時間: 電腦與網際網路程式設計 · 9 年前

關於batch 裡set的用法

最近需要用到batch來寫程式,

但是不管怎麼寫,

得到的都不會是我要的答案!

想請問各位專家們,

我要怎麼做,才能讓我的b=a

程式內容:

for /F %%i IN (c.tmp) DO (

set a=%%i

set b=%a%

echo %a%

echo %b%

)

c.tmp的內容:

test1

test2

test3

test4

已更新項目:

謝謝高手的回答

您讓我學會了延遲環境變數的做法

謝謝

1 個解答

評分
  • 是我
    Lv 5
    9 年前
    最佳解答

    原因與 c.tmp 內容無關,而在於 Windows 的 cmd 實在是一個不怎麼樣的 shell。

    他會在看到左括號、右括號時,事先取代括號當中的變數值,因此,您的程式:

    for /F %%i IN (c.tmp) DO (

    set a=%%i

    set b=%a%

    echo %a%

    echo %b%

    )

    執行時會成為

    for /F %%i IN (c.tmp) DO (

    set a=%%i

    set b=

    echo

    echo

    )

    因 a、b 之變數在括號前未做變數設定,執行到括號時,所有參考到 %a%、%b% 的地方皆被空值取代,造成非預期的結果。如依您的程式邏輯,可修改為:SETLOCAL ENABLEDELAYEDEXPANSION

    for /F %%i IN (c.tmp) DO (

    set a=%%i

    set b=!a!

    echo !a!

    echo !b!

    )以『延遲環境變數展開』(“SETLOCAL ENABLEDELAYEDEXPANSION” + “!” 使 cmd 於執行當中才替換 a、b 的值)的方式完成。

還有問題?馬上發問,尋求解答。