我想创建一个批处理文件函数来查看服务器,看看我是否需要更新任何程序。我设置它的方式现在可以在
之外工作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之外,它只是不想对每个人进行硬编码
答案 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 },MyServerLabel
到LocaleL1.Byte
的值,以及MyLocaleByte
到ServerL1.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 /?
我建议也阅读