在For循环中的CMD Setlocal EnableDelayedExpansion不能像我一样工作

时间:2018-04-16 04:58:37

标签: windows batch-file for-loop cmd

我想创建一个批处理文件函数来查看服务器,看看我是否需要更新任何程序。我设置它的方式现在可以在

之外工作
for /l ...

我面临的问题是你需要使用循环内部的事实!var!获取更新的变量值。如果你使用goto函数绕过它作为/ l的sudo它可以工作

以下是无法正常运行的代码行

setlocal enabledelayedexpansion
...

Set LocalL1=Example1.exe
Set /a LocalL1.Byte=1234
...

Set Servr1L=Example2.exe
Set /a LocalL1.Byte=1234
...

FOR /L %%A IN (1,1,%ServrList.Count%) DO (
   Set Temp1=!%LocalL%%%A!
   Set Temp2=!%ServrL%%%A!
   Set Temp1=!!Temp1!.byte!
   Set Temp2=!!Temp2!.byte!
)

实际结果

FOR /L %%A IN (1,1,%ServrList.Count%) DO (
   Set Temp1=Example1.exe
   Set Temp2=Example2.exe
   Set Temp1=Example2.exe.byte
   Set Temp2=Example2.exe.byte
)

我希望它输出

FOR /L %%A IN (1,1,%ServrList.Count%) DO (
   Set Temp1=Example1.exe
   Set Temp2=Example2.exe
   Set Temp1=1234
   Set Temp2=1234
)

如果您需要更多代码,请告诉我,但我必须执行“!%LocalL %%% A!”它的工作原理。在For / L之外,它只是不想对每个人进行硬编码

1 个答案:

答案 0 :(得分:3)

这个批处理代码应该可以工作,虽然不清楚你真正想要的是什么:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem ...

set "LocaleL1=Example1.exe"
set "LocaleL1.Byte=1234"
rem ...

set "ServerL1=Example2.exe"
set "ServerL1.Byte=4321"
rem ...

set "ServerList.Count=1"

for /L %%A in (1,1,%ServerList.Count%) do (
   set "MyLocaleLabel=!LocaleL%%A!"
   set "MyServerLabel=!ServerL%%A!"
   set "MyLocaleByte=!LocaleL%%A.Byte!"
   set "MyServerByte=!ServerL%%A.Byte!"
   set My
   echo/
)

endlocal

Windows命令解释程序首先在当前循环变量值的循环执行命令块期间替换%%A。然后使用延迟的环境变量扩展执行 SET ,从而将环境变量LocaleL1的值分配给环境变量MyLocaleLabel,将值ServerL1分配给{{1 },MyServerLabelLocaleL1.Byte的值,以及MyLocaleByteServerL1.Byte的值。

接下来输出名称中以MyServerByte开头的四个环境变量的值。因此,发布的批处理文件在命令提示符窗口中输出:

My

我更改了所有环境变量名称,因为有问题的原始名称对我来说太混乱了。

提示:不要使用算术表达式为环境变量赋值。环境变量总是字符串类型。

使用带MyLocaleByte=1234 MyLocaleLabel=Example1.exe MyServerByte=4321 MyServerLabel=Example2.exe 的算术表达式Windows命令解释器首先将带有十六进制字节set /a LocalL1.Byte=1234的字符串转换为值为31 32 33 34 00的32位有符号整数,保留在内存中使用四个十六进制字节1234(LSB到MSB),然后将整数转换回具有五个字节D2 04 00 00的字符串。尽管做得如此之快以至于没有人会在执行时间内发现31 32 33 34 00的差异,只执行一个简单的字符串复制(如果有的话),这没有多大意义。

在命令提示符窗口中进一步运行set "LocalL1.Byte=1234",并从第一页到最后一页仔细阅读输出帮助以获取命令 SET 。环境变量可以而且应该在算术表达式中通常仅通过其名称引用,而不使用set /?%,即!或更短set /A TCount=TCount + 1。该帮助解释了为什么这在算术表达式中有效,为什么这种语法更好。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • set /A TCount+=1
  • echo /?
  • endlocal /?
  • for /?
  • set /?

我建议也阅读