Supongamos que tengo variable un con el contenido de la «123» y la variable b123 con algún texto en ella. Por alguna razón quiero utilizar la variable un como parte de la segunda var nombre. Algo como esto:

SET a=123
SET b123=some_text_in_it
rem i want next line to output  "some_text_in_it"
echo %b%a%%

así que quiero concatenar texto con var contenido y el uso de cadena resultante como nombre de la variable a echo que los contenidos. La muestra de arriba no funciona y puedo ver por qué, probablemente tengo que añadir algún tipo de groupping. Cómo hacerlo, prefferably en una línea?

OriginalEl autor Aleksandr Kravets | 2012-03-14

3 Comentarios

  1. 8

    Hay dos formas comunes para este

    CALL o DelayedExpansion

    setlocal EnableDelayedExpansion
    SET a=123
    SET b123=some_text_in_it
    rem i want next line to output  "some_text_in_it"
    call echo %%b%a%%%
    echo !b%a%!
    

    La CALL variante utiliza el hecho de que una llamada de un reanálisis de la línea por segunda vez, la primera vez sólo la %a% será ampliado y el doble %% se reduce a una sola %

    call echo %b123%

    Y en el segundo paso, el %b123% será ampliado.

    Pero el CALL technic es lento y no muy seguro, por lo que el DelayedExpansion debe ser preferido.

    La DelayedExpansion obras como los signos de exclamación se expanden en un analizador posterior fase de la expansión de los porcentajes.

    Y esa es también la causa, ¿por qué retrasa la expansión es mucho más seguro.

    Edición: Método de las matrices que contienen los números de

    Si usted está operando con matrices que contiene sólo números, usted podría también utilizar set /a para acceder a ellos.

    Eso es mucho más fácil que el FOR o CALL technic y funciona también en bloques.

    setlocal EnableDelayedExpansion
    set arr[1]=17
    set arr[2]=35
    set arr[3]=77
    (
      set idx=2
      set /a val=arr[!idx!]
      echo !var!
    )
    
    Muchas gracias, se olvidó de DelayedExpansion…
    Aunque set /a es útil para acceder numéricos de los elementos de la matriz, no puede utilizar un índice modificado en el mismo set /a comando por las mismas razones que usted me explicó a continuación. Por ejemplo: set /a idx+=1, var=arr[!idx!] no obtener el derecho de elemento, por lo que esta gestión debe lograrse en dos separados set /a comandos.

    OriginalEl autor jeb

  2. 2

    La mejor razón para «utilizar una variable como parte de la segunda var name» es el acceso a la matriz (vector y matriz) elementos a través de un subíndice de la variable. Aunque este es exactamente el mismo que el ejemplo anterior, se ve mucho más claro:

    setlocal EnableDelayedExpansion
    set i=123
    set v[123]=Value of element 123
    call echo %%v[%i%]%%
    echo !v[%i%]!
    

    Aunque CALL es más lento que Delayed Expansion, como jeb dijo anteriormente, puede ser anidada varias veces permitiendo el uso de un segundo (o más profundo) direccionamiento indirecto para acceder a los elementos de la matriz. Esta característica puede ser utilizada en estructuras de datos complejas, como las listas enlazadas. Por ejemplo:

    set i=123
    set v[123]=456
    set w[456]=Value of element 456
    call call echo %%%%w[%%v[%i%]%%]%%%%
    

    EDITAR: Por alguna razón que no entiendo, el Retraso en la Expansión de la versión de el último comando no funciona correctamente:

    call echo !w[%%v[%i%]%%]!
    
    El call echo !w[%%v[%i%]%%]! se ampliará en el estándar de la orden. 1.Por ciento de expansión para call echo !w[%v[123]%]!, 2. expansión retardada a call echo como el w[%v[123]%] no es una variable definida por el 3. la llamada será ejecutar y empezar una nueva por ciento de expansión. La muestra debe verse como call echo %%w[!v[%i%]!]%% por Cierto. Después de un expansión retardada no se ejecuta nunca, explicó en ASÍ que: ¿Cómo CMD.EXE analizar secuencias de comandos
    bueno, yo tenía simillar razón para utilizar esta característica. Había un número de cadenas localizadas en varios idiomas en constantes con nombres idénticos en todo, excepto en postfix (por ejemplo, ‘my_text_1_de’,’my_text_1_it’…). Así que mi objetivo era asignar adecuada i18n cadenas a las variables después de lenguaje fue seleccionado por el usuario.
    Por supuesto!: el retraso en la expansión se hace antes ejecutar el comando, que, en este caso (call), es el responsable de la segunda expansión de los signos de porcentaje. Muchas gracias 🙂
    Sugiero que para incluir el cambio de la parte del nombre de la variable entre paréntesis como estándar de matrices en otros idiomas? ‘my_text_1[de]’,’my_text_1[es]» Aunque este es el mismo para el procesamiento por Lotes, es más clara para los programadores!
    Disculpe, pero la solución que propone es una solución, no una matriz de apoyo que usted puede encontrar en Python o Perl o normal de cualquier lenguaje de programación. Incluso se puede pensar en él como un Hash( tabla de índices son cadenas, recuerda). Pero no Es una VERDADERA hash de la tabla, es Q&D solución, útil, intuitiva, pero sigue siendo una solución. Tal vez estoy criticas, pero es porque yo no soy un MURCIÉLAGO verdadero amante, sólo tengo que trabajar con un Bate de archivo.

    OriginalEl autor Aacini

  3. 2

    Sin embargo, hay una manera más de realizar la tarea que es muy útil si ambas variables han sido asignadas dentro de la misma entre paréntesis bloque que se está expandiendo. La solución es similar a jeb retrasada de la expansión de la respuesta, a excepción de que se utiliza una variable en lugar de la normal de expansión.

    @echo off
    setlocal enableDelayedExpansion
    
    :: Define a linefeed value - only needed for last variant
    set LF=^
    
    
    :: The two blank lines above are critical to the definition of LF
    
    (
      set A=123
      set B123=some_text_in_it
    
      rem ECHO !B%A%! will fail because A was assigned within the same block
    
      rem This works as long as A does not contain * or ?
      for %%A in ("!A!") do echo !B%%~A!
    
      rem This works as long as A does not start with EOL character (; by default)
      for /f "delims=" %%A in ("!A!") do echo !B%%A!
    
      rem This will never fail because it disables EOL by setting it to a linefeed
      for /f eol^=^%LF%%LF%^ delims^= %%A in ("!A!") do echo !B%%A!
    )
    

    La LLAMADA truco también podría ser utilizado, pero comparativamente es muy lento, y es poco fiable – ver Me LLAMAN, o mejor evitar llamar.

    La definición y el uso de un salto de línea variable se discute en Explicar cómo dos lotes variable newline hack funciona.

    Configuración EOL para un salto de línea se describe en detalle en CÓMO: FOR /F Desactivación de EOL o utilizar una cita como delim. El uso de un LF variable en lugar de insertar saltos de línea dentro de la instrucción FOR es sólo una extensión de la técnica. Que hace el código más legible.

    EDITAR

    Una manera más simple de utilizar de forma segura PARA la técnica para cualquier valor válido es el conjunto de EOL a un signo de igualdad, ya que ninguna variable definida por el usuario puede contener un = en el nombre.

    for /f "eol== delims=" %%A in ("!A!") do echo !B%%A!
    

    OriginalEl autor dbenham

Dejar respuesta

Please enter your comment!
Please enter your name here