variables - Nombre de variable anidada en lote DOS con EnableDelayedExpansion
batch-file nested (3)
Estoy trabajando en un script para obtener longitudes máximas de cada columna, estoy tratando de almacenar longitudes de longitud máxima en _c1 ... n vars. numero de columnas desconocidas
Pude obtener la longitud para cada columna, crear variables para almacenar cada una con el conjunto _c! I! =! n !, n es la longitud pero para establecer la longitud máxima para una columna en particular, necesito comparar la corriente con la máxima y usar algo como! _c !! i !! que no funciona, ¿alguna idea de cómo referir una variable a qué parte de su nombre proviene de otra variable?
Gracias...
En su caso, podría haber una tercera solución posible, si sus variables solo contienen números.
@echo off
setlocal enabledelayedexpansion
(
set i=10
set _c!i!=4711
set /a tmp=_c!i!
echo !tmp!
)
Esto funciona, ya que SET /A
puede acceder al contenido de una variable sin el nedd de caracteres de expansión explícita.
La técnica CALL sugerida por James K funcionará, pero es relativamente lenta y puede ser insegura, dependiendo del contenido de la variable.
Lo siguiente parece más complicado, pero es significativamente más rápido y más confiable:
for %%A in (!i!) do echo !_c%%A!
Supongo que está utilizando el carácter de expansión retardada porque está trabajando dentro de un conjunto de corchetes "()". Hacer eso hace que tu proceso sea más difícil. Sé que ese método es más fácil de leer, pero es más difícil codificarlo.
Dentro de los corchetes, sé de un solo método para acceder a una variable que fue ''construida'' a partir de una o más variables. Eso es usar la función de call
para hacer que la variable ensamblada se ''active''. Este método funciona tanto dentro como fuera de los paréntesis.
Aquí hay un pequeño ejemplo:
@echo off
setlocal enabledelayedexpansion
(
set i=10
set _c!i!=something
:: below is equivalent to echo !_c10!
call echo %%_c!i!%%
)
endlocal
Salida:
something
Puedes hacer casi todo usando una CALL
en frente que puedas sin ella, aunque en XP o antes no puedes llamar a comandos internos como if
y solo puedes llamar a programas ''externos'' como FIND.EXE.
Si puede trabajar fuera de un conjunto de corchetes utilizando posiblemente una instrucción call :label
, simplemente puede acceder a la variable de esta manera:
@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
Salida:
something
something