Batch file &引用;至于;循环未按需要工作

Batch file &引用;至于;循环未按需要工作,batch-file,Batch File,我有以下代码: 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 有人能告诉我怎么做吗?您需要: setlocal enableextensions enabledel

我有以下代码:

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
有人能告诉我怎么做吗?

您需要:

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
,您需要:

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
,我想这就是你想要的:

@Echo关闭
设置“a=”
设置“b=你好”
设置“c=1”
设置“d=5”
对于(%c%,1,%d%)中的/L%%A,请调用集合“A=%%A%%%b%%%A”
如果定义了回显%a%
暂停
或者:

@Echo关闭
设置“a=”
设置“b=你好”
设置“c=1”
设置“d=5”
对于(1,%c%,%d%)中的/L%%A,请调用集合“A=%%A%%%b%%%A”
如果定义了回显%a%
暂停

我想这就是你想要的:

@Echo关闭
设置“a=”
设置“b=你好”
设置“c=1”
设置“d=5”
对于(%c%,1,%d%)中的/L%%A,请调用集合“A=%%A%%%b%%%A”
如果定义了回显%a%
暂停
或者:

@Echo关闭
设置“a=”
设置“b=你好”
设置“c=1”
设置“d=5”
对于(1,%c%,%d%)中的/L%%A,请调用集合“A=%%A%%%b%%%A”
如果定义了回显%a%
暂停

“请注意,不变量
b
不需要延迟扩展,但一旦确定需要它们,您还可以在任何地方使用它们。”。我不同意。在这种情况下,没有任何理由在
b
上使用延迟扩展,这一点适用于大多数情况。这种情况下唯一的区别是使用
!b
而不是
%b%
运行稍微慢一点,但在其他情况下,这样做甚至可能导致错误的结果。延迟扩展的使用总是取决于具体的问题…@Aacini,我实际上在那句话的结尾给出了我认为这是一个好主意的原因,而这个问题的存在本身就是一个原因。大多数编码人员期望他们的代码具有正常的时间行为(好吧,除了Prolog这样的非过程性语言),因为如果您更改了一个数据项,然后使用它,它就具有您更改为的值。我实际上认为<>代码> %…%>代码>是奇怪的方法,我怀疑这也是为什么MS最终添加延迟扩展的原因。“注意,对于不变的<代码> B<代码,你不需要延迟扩展。但是,一旦你决定你需要它们,你也可以随处使用它们。”我不同意。在这种情况下,没有任何理由在
b
上使用延迟扩展,这一点适用于大多数情况。这种情况下唯一的区别是使用
!b
而不是
%b%
运行稍微慢一点,但在其他情况下,这样做甚至可能导致错误的结果。延迟扩展的使用总是取决于具体的问题…@Aacini,我实际上在那句话的结尾给出了我认为这是一个好主意的原因,而这个问题的存在本身就是一个原因。大多数编码人员期望他们的代码具有正常的时间行为(好吧,除了Prolog这样的非过程性语言),因为如果您更改了一个数据项,然后使用它,它就具有您更改为的值。我实际上认为<代码> %…%>代码>是奇怪的方法,我怀疑这也是为什么MS最终添加延迟扩展的原因。从代码中得到的结果只是代码> HeloL1,不是你写的那个…你的代码的结果只是代码> HeloL1,不是你写的那个…