2017-09-01 117 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