【问题标题】:Nested variable name using EnableDelayedExpansion使用 EnableDelayedExpansion 的嵌套变量名称
【发布时间】:2012-08-27 21:48:27
【问题描述】:
我正在编写一个脚本来获取每列的最大长度,我正在尝试将最大长度的长度存储在 _c1...n 变量中。列数未知。
我能够获取每列的长度,创建变量以使用 set _c!i! = !n!, n 是长度
但为了设置特定列的最大长度,我需要将 current 与 max 进行比较并使用类似 !_c!!i!!这不起作用,任何想法如何引用一个变量,它的名称的哪一部分来自另一个变量?
谢谢...
【问题讨论】:
标签:
batch-file
variables
cmd
nested
delayedvariableexpansion
【解决方案1】:
我假设您正在使用延迟扩展字符,因为您在一组括号“()”内工作。这样做会使您的过程更加困难。我知道这种方法更容易阅读,但编写代码却更难。
在括号内,我只知道一种访问由一个或多个变量“构建”的变量的方法。也就是使用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
【解决方案2】:
James K 建议的 CALL 技术会起作用,但它相对较慢并且可能不安全,具体取决于变量的内容。
以下看起来更复杂,但它明显更快更可靠:
for %%A in (!i!) do echo !_c%%A!
【解决方案3】:
如果您的变量仅包含数字,则可能有第三种解决方案。
@echo off
setlocal enabledelayedexpansion
(
set i=10
set _c!i!=4711
set /a tmp=_c!i!
echo !tmp!
)
这是可行的,因为SET /A 可以访问变量的内容,而无需显式扩展字符。