

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Utilice construcciones en bucle en TOE de AWS
<a name="toe-looping-constructs"></a>

En esta sección se proporciona información que le ayudará a crear constructos en bucle en TOE de AWS. Los constructos en bucle definen una secuencia repetida de instrucciones. Puede utilizar los siguientes tipos de constructos en bucle en TOE de AWS:
+ Constructos `for`: se repiten en iteraciones sobre una secuencia acotada de números enteros.
+ Constructos `forEach`
  + Bucle `forEach` con lista de entradas: se repite en iteraciones sobre una colección finita de cadenas. 
  + Bucle `forEach` con lista delimitada: repite una colección finita de cadenas unidas por un delimitador.

**nota**  
Los constructos en bucle solo admiten tipos de datos de cadena.

**Topics**
+ [Variables de iteración de referencia](#toe-loop-iteration-variables)
+ [Tipos de constructos en bucle](#toe-loop-types)
+ [Campos de pasos](#toe-loop-step-fields)
+ [Salidas de paso e iteración](#toe-loop-step-output)

## Variables de iteración de referencia
<a name="toe-loop-iteration-variables"></a>

Para hacer referencia al índice y al valor de la variable de iteración actual, la expresión de referencia `{{ loop.* }}` debe usarse en el cuerpo de entrada de un paso que contenga un constructo en bucle. Esta expresión no se puede utilizar para hacer referencia a las variables de iteración del constructo en bucle de otro paso.

La expresión de referencia consta de los siguientes miembros:
+ `{{ loop.index }}`: la posición ordinal de la iteración actual, que está indexada en `0`. 
+ `{{ loop.value }}`: el valor asociado a la variable de iteración actual. 

### Nombres de bucles
<a name="toe-loop-iteration-variables-names"></a>

 Todos los constructos en bucle tienen un campo de nombre opcional para su identificación. Si se proporciona un nombre de bucle, este se puede utilizar para hacer referencia a las variables de iteración del cuerpo de entrada del paso. Para hacer referencia a los índices y valores de iteración de un bucle denominado, utilice `{{ <loop_name>.* }}` con `{{ loop.* }}` en el cuerpo de entrada del paso. Esta expresión no se puede utilizar para hacer referencia al constructo en bucle denominado de otro paso. 

La expresión de referencia consta de los siguientes miembros:
+ `{{ <loop_name>.index }}`: la posición ordinal de la iteración actual del bucle denominado, que está indexada en `0`.
+ `{{ <loop_name>.value }}` : el valor asociado a la variable de iteración actual del bucle denominado.

### Resolución de expresiones de referencia
<a name="toe-loop-iteration-variables-expressions"></a>

 TOE de AWS Resuelve las expresiones de referencia de la siguiente manera: 
+ `{{ <loop_name>.* }}`— TOE de AWS resuelve esta expresión mediante la siguiente lógica:
  + Si el bucle del paso que se está ejecutando actualmente coincide con el valor `<loop_name>`, la expresión de referencia se convierte en el constructo en bucle del paso que se está ejecutando actualmente.
  + `<loop_name>` se resuelve en el constructo de bucle denominado si aparece dentro del paso que se está ejecutando actualmente.
+ `{{ loop.* }}`— TOE de AWS resuelve la expresión mediante la construcción de bucle definida en el paso que se está ejecutando actualmente.

Si se utilizan expresiones de referencia en un paso que no contiene un bucle, TOE de AWS no resuelve las expresiones y aparecen en el paso sin sustituirlas. 

**nota**  
Las expresiones de referencia deben estar entre comillas dobles para que el compilador YAML las interprete correctamente.

## Tipos de constructos en bucle
<a name="toe-loop-types"></a>

Esta sección contiene información y ejemplos sobre los tipos de constructos en bucle que se pueden utilizar en TOE de AWS.

**Topics**
+ [Bucle `for`](#toe-loop-types-for)
+ [Bucle `forEach` con lista de entradas](#toe-loop-types-foreach)
+ [Bucle `forEach` con lista delimitada](#toe-loop-types-foreach-delimited)

### Bucle `for`
<a name="toe-loop-types-for"></a>

El bucle `for` itera en un rango de enteros especificado dentro de un límite delimitado por el inicio y el final de las variables. Los valores iterativos están en el conjunto `[start, end]` e incluyen los valores límite.

TOE de AWS verifica los `updateBy` valores `start``end`, y para garantizar que la combinación no dé como resultado un bucle infinito.

Esquema de bucle `for`

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      for:
        start: int
        end: int
        updateBy: int
inputs:
  ...
```


**Entrada de bucle `for`**  

| Campo | Description (Descripción) | Tipo | Obligatorio/a | Predeterminado | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nombre único del bucle. Debe ser único en comparación con otros nombres de bucles de la misma fase. |  Cadena  |  No  |  ""  | 
|  `start`  | Valor inicial de la iteración. No acepta expresiones encadenadas.  |  Entero  |  Sí  |  n/a  | 
| `end` | Valor final de la iteración. No acepta expresiones encadenadas.  | Entero | Sí | n/a | 
| `updateBy` | Diferencia por la que un valor iterativo se actualiza mediante la adición. Debe ser un valor negativo o positivo distinto de cero. No acepta expresiones encadenadas.  | Entero | Sí | n/a | 

Ejemplo de entrada de bucle `for`

```
  - name: "CalculateFileUploadLatencies"
    action: "ExecutePowerShell"
    loop:
      for:
        start: 100000
        end: 1000000
        updateBy: 100000
    inputs:
      commands:
        - |
          $f = new-object System.IO.FileStream c:\temp\test{{ loop.index }}.txt, Create, ReadWrite
          $f.SetLength({{ loop.value }}MB)
          $f.Close()
        - c:\users\administrator\downloads\latencyTest.exe --file c:\temp\test{{ loop.index }}.txt
        - AWS s3 cp c:\users\administrator\downloads\latencyMetrics.json s3://bucket/latencyMetrics.json
        - |
          Remove-Item -Path c:\temp\test{{ loop.index }}.txt
          Remove-Item -Path c:\users\administrator\downloads\latencyMetrics.json
```

### Bucle `forEach` con lista de entradas
<a name="toe-loop-types-foreach"></a>

El bucle `forEach` itera en una lista explícita de valores, que pueden ser cadenas y expresiones encadenadas. 

Bucle `forEach` con esquema de lista de entrada

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      forEach:
        - "string"
    inputs:
  ...
```


**Bucle `forEach` con entrada de lista de entrada**  

| Campo | Description (Descripción) | Tipo | Obligatorio/a | Predeterminado | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nombre único del bucle. Debe ser único en comparación con otros nombres de bucles de la misma fase. |  Cadena  |  No  |  ""  | 
|  Lista de cadenas de bucle `forEach`  |  Lista de cadenas para la iteración. Acepta expresiones encadenadas como cadenas en la lista. Las expresiones encadenadas deben estar entre comillas dobles para que el compilador YAML las interprete correctamente.  |  Lista de cadenas  |  Sí  |  n/a  | 

Bucle `forEach` con lista de entradas (ejemplo 1)

```
  - name: "ExecuteCustomScripts"
    action: "ExecuteBash"
    loop:
      name: BatchExecLoop
      forEach:
        - /tmp/script1.sh
        - /tmp/script2.sh
        - /tmp/script3.sh
    inputs:
      commands:
        - echo "Count {{ BatchExecLoop.index }}"
        - sh "{{ loop.value }}"
        - |
          retVal=$?
          if [ $retVal -ne 0 ]; then
            echo "Failed"
          else
            echo "Passed"
         fi
```

Bucle `forEach` con lista de entradas (ejemplo 2)

```
  - name: "RunMSIWithDifferentArgs"
    action: "ExecuteBinary"
    loop:
      name: MultiArgLoop
      forEach:
        - "ARG1=C:\Users ARG2=1"
        - "ARG1=C:\Users"
        - "ARG1=C:\Users ARG3=C:\Users\Administrator\Documents\f1.txt"
    inputs:
      commands:
        path: "c:\users\administrator\downloads\runner.exe"
        args:
          - "{{ MultiArgLoop.value }}"
```

Bucle `forEach` con lista de entradas (ejemplo 3)

```
  - name: "DownloadAllBinaries"
    action: "S3Download"
    loop:
      name: MultiArgLoop
      forEach:
        - "bin1.exe"
        - "bin10.exe"
        - "bin5.exe"
    inputs:
      - source: "s3://bucket/{{ loop.value }}"
        destination: "c:\temp\{{ loop.value }}"
```

### Bucle `forEach` con lista delimitada
<a name="toe-loop-types-foreach-delimited"></a>

El bucle itera sobre una cadena que contiene valores separados por un delimitador. Para recorrer en iteración los componentes de la cadena, TOE de AWS utiliza el delimitador para dividir la cadena en una matriz adecuada para la iteración. 

Bucle `forEach` con esquema de lista delimitada

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      forEach:
        list: "string"
        delimiter: ".,;:\n\t -_"
    inputs:
  ...
```


**Bucle `forEach` con entrada de lista delimitada**  

| Campo | Description (Descripción) | Tipo | Obligatorio/a | Predeterminado | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nombre único del bucle. Debe ser único en comparación con otros nombres de bucles de la misma fase. |  Cadena  |  No  |  ""  | 
|  `list`  | Cadena compuesta por cadenas constitutivas unidas por un carácter delimitador común. También acepta expresiones encadenadas. En el caso de expresiones encadenadas, asegúrese de que estén entre comillas dobles para que el compilador de YAML las interprete correctamente. | Cadena |  Sí  |  n/a  | 
| `delimiter` | Carácter que se usa para separar las cadenas dentro de un bloque. El valor predeterminado es el carácter de coma. Solo se permite un carácter delimitador de la lista dada: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/imagebuilder/latest/userguide/toe-looping-constructs.html) No se pueden utilizar expresiones encadenadas. | Cadena | No | Coma: "," | 

**nota**  
El valor de `list` se trata como una cadena inmutable. Si la fuente de `list` se cambia durante el tiempo de ejecución, no se reflejará durante la ejecución.

Bucle `forEach` con lista delimitada (ejemplo 1)

Este ejemplo utiliza el siguiente patrón de expresión de encadenamiento para hacer referencia al resultado de otro paso: `<phase_name>.<step_name>.[inputs | outputs].<var_name>`.

```
  - name: "RunMSIs"
    action: "ExecuteBinary"
    loop:
      forEach:
        list: "{{ build.GetAllMSIPathsForInstallation.outputs.stdout }}"
        delimiter: "\n"
    inputs:
      commands:
        path: "{{ loop.value }}"
```

Bucle `forEach` con lista delimitada (ejemplo 2)

```
  - name: "UploadMetricFiles"
    action: "S3Upload"
    loop:
      forEach:
        list: "/tmp/m1.txt,/tmp/m2.txt,/tmp/m3.txt,..."
    inputs:
      commands:
        - source: "{{ loop.value }}"
          destination: "s3://bucket/key/{{ loop.value }}"
```

## Campos de pasos
<a name="toe-loop-step-fields"></a>

Los bucles son parte de un paso. Los campos relacionados con la ejecución de un paso no se aplican a las iteraciones individuales. Los campos de paso se aplican solo a nivel del paso, de la siguiente manera:
+ *timeoutSeconds*: todas las iteraciones del bucle deben ejecutarse dentro del período de tiempo especificado en este campo. Si se agota el tiempo de espera del bucle, TOE de AWS ejecuta la política de reintentos del paso y restablece el parámetro de tiempo de espera para cada nuevo intento. Si la ejecución del bucle supera el valor de tiempo de espera tras alcanzar el número máximo de reintentos, el mensaje de error del paso indica que se ha agotado el tiempo de espera de la ejecución del bucle. 
+ *onFailure*: la administración de errores se aplica al paso de la siguiente manera:
  + Si *OnFailure* está establecido en`Abort`, TOE de AWS sale del bucle y vuelve a intentar el paso de acuerdo con la política de reintentos. Tras el número máximo de reintentos, TOE de AWS marca el paso actual como fallido y detiene la ejecución del proceso.

    TOE de AWS establece el código de estado de la fase principal y el documento en. `Failed`
**nota**  
No se ejecutarán más pasos después del paso con errores.
  + Si *onFailure* está establecido como `Continue`, TOE de AWS sale del bucle y vuelve a intentar el paso de acuerdo con la política de reintentos. Tras el número máximo de reintentos, TOE de AWS marca el paso actual como fallido y continúa con el paso siguiente.

    TOE de AWS establece el código de estado de la fase principal y el documento en. `Failed`
  + Si *onFailure* está establecido como `Ignore`, TOE de AWS sale del bucle y vuelve a intentar el paso de acuerdo con la política de reintentos. Tras el número máximo de reintentos, TOE de AWS marca el paso actual como `IgnoredFailure` y continúa hasta ejecutar el paso siguiente.

    TOE de AWS establece el código de estado de la fase principal y el documento en. `SuccessWithIgnoredFailure`
**nota**  
Esto sigue considerándose una ejecución correcta, pero incluye información que le permite saber que uno o más pasos tienen errores y se ignoraron.
+ *maxAttempts*: para cada reintento, todo el paso y todas las iteraciones se ejecutan desde el principio.
+ *status*: el estado general de la ejecución de un paso. `status` no representa el estado de las iteraciones individuales. El estado de un paso con bucles se determina de la siguiente manera:
  + Si no se puede ejecutar una sola iteración, el estado de un paso indica que se ha producido un error.
  + Si todas las iteraciones se realizan correctamente, el estado de un paso indica que se ha realizado correctamente.
+ *startTime*: hora de inicio general de la ejecución de un paso. No representa la hora de inicio de las iteraciones individuales.
+ *endTime*: la hora de finalización general de la ejecución de un paso. No representa la hora de finalización de las iteraciones individuales.
+ *failureMessage*: incluye los índices de iteración que fallaron en caso de errores sin tiempo de espera. En caso de errores de tiempo de espera, el mensaje indica que se produjo un error en la ejecución del bucle. No se proporcionan mensajes de error individuales para cada iteración para minimizar el tamaño de los mensajes de error.

## Salidas de paso e iteración
<a name="toe-loop-step-output"></a>

Cada iteración contiene una salida. Al final de una ejecución en bucle, TOE de AWS consolida todos los resultados de la iteración correcta. `detailedOutput.json` Las salidas consolidadas son una recopilación de valores que pertenecen a las claves de salida correspondientes, como se define en el esquema de salida del módulo de acción. El siguiente ejemplo muestra cómo se consolidan las salidas:

**Salida de `ExecuteBash` para la iteración 1**

```
{
	"stdout":"Hello"
}
```

**Salida de `ExecuteBash` para la iteración 2**

```
{
	"stdout":"World"
}
```

**Salida de `ExecuteBash` para el paso**

```
{
	"stdout":"Hello\nWorld"
}
```

Por ejemplo, `ExecuteBash`, `ExecutePowerShell` y `ExecuteBinary` son módulos de acción que se devuelven `STDOUT` como salida del módulo de acción. Los mensajes `STDOUT` se unen con el carácter de la nueva línea para producir la salida general del paso en `detailedOutput.json`.

TOE de AWS no consolidará los resultados de las iteraciones fallidas.