DOS Batch使用EnableDelayedExpansion嵌套变量名

时间:2012-08-27 21:48:27

标签: variables batch-file nested dos

我正在编写一个脚本来获取每列的最大长度,我试图在_c1 ... n变量中存储最大长度的长度。列数未知。

我能够获得每列的长度,创建变量来存储每一个set _c!i! =!n!,n是长度 但是为了设置特定列的最大长度,我需要将当前值与最大值进行比较并使用类似的东西!_c !! i !!什么不起作用,任何想法如何引用变量的哪一部分名称来自另一个变量?

...谢谢

3 个答案:

答案 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。