iT邦幫忙

0

請教前輩在寫bat檔時,其中的變數一直為空值( !item[%counterI%]! ),不知道哪裡錯?

程式碼如下

setlocal enabledelayedexpansion
set counterI=0 
FOR /f "eol=; tokens=1 delims=," %%i in (username.txt) do ( 
    set /A counterI = counterI + 1 
    set item[!counterI!] = %%i
    echo item[!counterI!] = %%i
    ) 
    echo.
    echo 清單內共有:!counterI! 帳號 
    echo 變數測試:item[%counterI%] = !item[%counterI%]!
 pause

執行結果

item[1] = All Users
item[2] = Default
item[3] = Default User
item[4] = mtadministrator
item[5] = Public
item[6] = test1

清單內共有:6 帳號
變數測試:item[6] =
請按任意鍵繼續 . . .

最後的!item[%counterI%]!為什麼沒反應?

1 個回答

1
eric_suwh
iT邦新手 5 級 ‧ 2020-04-26 21:13:46
最佳解答

有問題這行要改成

call echo 變數測試:item[!counterI!] = %%item[!counterI!]%%

因為要進行2次的變數替換,才能正確求出變數的值
第一次,在 call 後面的這些字串丟給 call 之前,已經替換成

echo 變數測試:item[6] = %item[6]%

第二次,在 echo 輸出前,又替換成

變數測試:item[6] = test1

以下可在 Win XP 上正確執行

@echo off

setlocal enabledelayedexpansion
set counterI=0 
FOR /f "eol=; tokens=1 delims=," %%i in (username.txt) do ( 
    set /A counterI = counterI + 1 
    set item[!counterI!]=%%i
    echo item[!counterI!]=%%i
) 
echo.
echo 清單內共有:!counterI! 帳號 
call echo 變數測試:item[!counterI!] = %%item[!counterI!]%%

endlocal
item[1]=All Users
item[2]=Default
item[3]=Default User
item[4]=mtadministrator
item[5]=Public
item[6]=test1

清單內共有:6 帳號
變數測試:item[6] = test1
看更多先前的回應...收起先前的回應...
ATF_G iT邦新手 5 級 ‧ 2020-04-26 21:40:14 檢舉

首先感謝前輩指點,再請問
1.加call是為了再呼叫一次嗎?
2.
不加call結果跟您說的一樣

變數測試:item[6] = %item[6]%

加了call之後再空了

變數測試:item[6] = 

---------測試環境----------
vm win10 1909 會有差別嗎?

eric_suwh iT邦新手 5 級 ‧ 2020-04-26 22:01:45 檢舉
  1. call 是為了讓這行字串,強制解析變數,參考下面的程式碼
  2. 試試設定變數時「=」的兩邊不要有空白。set item[!counterI!]=%%i
  3. 我只有 WinXP 可以測試,所以我也不清楚
@echo off

setlocal enabledelayedexpansion
set counterI=0 
FOR /f "eol=; tokens=1 delims=," %%i in (username.txt) do ( 
    set /A counterI = counterI + 1 
    set item[!counterI!]=%%i
    echo item[!counterI!]=%%i
) 
echo.
echo 清單內共有:!counterI! 帳號 
set str=變數測試:item[!counterI!] = %%item[!counterI!]%%
echo %str%
call echo %str%
endlocal

輸出:

item[1]=All Users
item[2]=Default
item[3]=Default User
item[4]=mtadministrator
item[5]=Public
item[6]=test1

清單內共有:6 帳號
變數測試:item[6] = %item[6]%
變數測試:item[6] = test1
ATF_G iT邦新手 5 級 ‧ 2020-04-26 22:16:55 檢舉

感謝您的幫忙^^
沒錯,就是因為空格,太氣人了
BAT裡空格不是會略過嗎
又不是字串

eric_suwh iT邦新手 5 級 ‧ 2020-04-26 22:25:37 檢舉

若設定變數時「=」的兩邊有空白,
那變數名也會包含空白,
引用該變數時,也要記得包含空白。

我要發表回答

立即登入回答