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