2017-09-01 144 views
0

我有以下代碼:「for」 循環不工作按需要

set b=Hello 
set c=1 
set d=5 
for /l %%x in (1,1,%d%) do (set /a c=c+1 & set "a=%a%%b%%c%") 
echo %a% 

而對於這一點,我想輸出爲:

Hello1Hello2Hello3Hello4Hello5 

但是,相反,我得到的結果爲:

Hello1Hello1Hello1Hello1Hello1 

任何人都可以給我任何想法,我怎麼能這樣做?

+0

你的代碼的結果就是'Hello1',不是你寫的那個...... – Aacini

回答

3

您需要:

setlocal enableextensions enabledelayedexpansion 
set b=Hello 
set c=0 
set d=5 
for /l %%x in (1,1,%d%) do (set /a c=c+1 & set "a=!a!!b!!c!") 
echo %a% 
endlocal 

%!變種將擴大變量的代碼是執行%代碼時解析擴展的時間。而且,由於解析發生在整個語句上(從for到右括號),所以只會得到原始值。

請注意,你不需要爲不變b延遲擴展,但是,一旦你決定了你需要的話,你不妨在任何地方使用他們 - 他們表現得更爲你在大多數情況下,指望。

你會注意到我也改變了c的初始值,以得到你想表達的結果。因爲它是,你會得到2,3,4,5,6而不是1,2,3,4,5

+0

_「請注意,你不需要爲不變的'b'擴展_delayed,但是一旦你決定需要它們,你可以在任何地方使用它們「_。我不同意。在這種情況下,沒有任何理由在'b'上使用延遲擴展,同樣的觀點適用於_most cases_。這種情況唯一的區別是使用'!b!'而不是'%b%'運行速度稍慢,但在其他情況下,這可能會導致錯誤的結果。延遲擴張的使用總是取決於具體的問題... – Aacini

+0

它的工作。謝謝! – RajaEzzy

+0

@Aacini,我確實給出了*理由*,爲什麼我認爲這句話結束時這是一個好主意,而這個問題的存在就說明了爲什麼。大多數編碼人員希望他們的代碼具有正常的時間行爲(當然,除了像Prolog這樣的非過程式語言之外),如果你改變了一個數據項然後使用它,它就具有你改變的值。我實際上認爲'%...%'的行爲是奇怪的方法,我懷疑這也是MS最終加入延遲擴展的原因。 – paxdiablo

-3

在您的代碼開始處添加以下行。

SETLOCAL ENABLEDELAYEDEXPANSION

,將解決這個問題

+5

您可能想*嘗試*建議的解決方案,以確保它們的工作 - 這一個不會:-)你需要標記延遲擴展*和*實際使用它。 – paxdiablo

1

我想這是你想要什麼:

@Echo Off 
Set "a=" 
Set "b=Hello" 
Set "c=1" 
Set "d=5" 
For /L %%A In (%c%,1,%d%) Do Call Set "a=%%a%%%b%%%A" 
If Defined a Echo %a% 
Pause 

或者:

@Echo Off 
Set "a=" 
Set "b=Hello" 
Set "c=1" 
Set "d=5" 
For /L %%A In (1,%c%,%d%) Do Call Set "a=%%a%%%b%%%A" 
If Defined a Echo %a% 
Pause