我正在编写一个脚本来获取每列的最大长度,我试图在_c1 ... n变量中存储最大长度的长度。列数未知。
我能够获得每列的长度,创建变量来存储每一个set _c!i! =!n!,n是长度 但是为了设置特定列的最大长度,我需要将当前值与最大值进行比较并使用类似的东西!_c !! i !!什么不起作用,任何想法如何引用变量的哪一部分名称来自另一个变量?
...谢谢
答案 0 :(得分:2)
我假设您正在使用延迟扩展字符,因为您在一组括号“()”内部工作。这样做会使您的流程更难。我知道这种方法更容易阅读,但编码起来比较困难。
在括号内,我知道只有一种方法可以访问由一个或多个变量“构建”的变量。那就是使用call
函数使组合变量“激活”。此方法适用于括号内部和外部。
这是一个小例子:
@echo off
setlocal enabledelayedexpansion
(
set i=10
set _c!i!=something
:: below is equivalent to echo !_c10!
call echo %%_c!i!%%
)
endlocal
输出:
something
你可以使用前面的CALL
做几乎所有事情,没有它你可以做到,尽管在XP或更早版本中你不能调用像if
这样的内部命令,只能调用像'外部'这样的程序FIND.EXE。
如果你可以使用call :label
语句在一组括号外工作,你可以像这样访问变量:
@echo off
setlocal enabledelayedexpansion
set i=10
set _c!i!=something
:: The below 2 statements are equivalent to `echo %_c10%`
echo !_c%i%!
call echo %%_c!i!%%
endlocal
输出:
something
something
答案 1 :(得分:1)
James K建议的CALL技术可行,但它相对较慢,可能不安全,具体取决于变量的内容。
以下看起来更复杂,但速度更快,更可靠:
for %%A in (!i!) do echo !_c%%A!
答案 2 :(得分:1)
在您的情况下,如果您的变量仅包含数字,则可能存在第三种解决方案。
@echo off
setlocal enabledelayedexpansion
(
set i=10
set _c!i!=4711
set /a tmp=_c!i!
echo !tmp!
)
这是有效的,因为SET /A
可以访问变量的内容,而不需要明确扩展字符的nedd。