

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Gunakan konstruksi perulangan di AWSTOE
<a name="toe-looping-constructs"></a>

Bagian ini memberikan informasi untuk membantu Anda membuat konstruksi perulangan di. AWSTOE Konstruksi perulangan mendefinisikan urutan instruksi yang berulang. Anda dapat menggunakan jenis konstruksi perulangan berikut di: AWSTOE
+ `for`konstruksi - Iterasi atas urutan bilangan bulat yang dibatasi.
+ `forEach`membangun
  + `forEach`loop dengan daftar masukan - Iterasi atas kumpulan string yang terbatas. 
  + `forEach`loop dengan daftar terbatas - Iterasi di atas kumpulan string terbatas yang bergabung dengan pembatas.

**catatan**  
Konstruksi perulangan hanya mendukung tipe data string.

**Topics**
+ [Variabel iterasi referensi](#toe-loop-iteration-variables)
+ [Jenis konstruksi perulangan](#toe-loop-types)
+ [Bidang langkah](#toe-loop-step-fields)
+ [Output langkah dan iterasi](#toe-loop-step-output)

## Variabel iterasi referensi
<a name="toe-loop-iteration-variables"></a>

Untuk merujuk pada indeks dan nilai variabel iterasi saat ini, ekspresi referensi `{{ loop.* }}` harus digunakan dalam badan input dari langkah yang berisi konstruksi perulangan. Ekspresi ini tidak dapat digunakan untuk merujuk ke variabel iterasi dari konstruksi perulangan dari langkah lain.

Ekspresi referensi terdiri dari anggota berikut:
+ `{{ loop.index }}`— Posisi ordinal dari iterasi saat ini, yang diindeks di. `0` 
+ `{{ loop.value }}`— Nilai yang terkait dengan variabel iterasi saat ini. 

### Nama loop
<a name="toe-loop-iteration-variables-names"></a>

 Semua konstruksi perulangan memiliki bidang nama opsional untuk identifikasi. Jika nama loop disediakan, dapat digunakan untuk merujuk ke variabel iterasi di badan input langkah. Untuk merujuk pada indeks iterasi dan nilai loop bernama, gunakan `{{ <loop_name>.* }}` dengan `{{ loop.* }}` di badan input langkah. Ekspresi ini tidak dapat digunakan untuk merujuk pada konstruksi perulangan bernama dari langkah lain. 

Ekspresi referensi terdiri dari anggota berikut:
+ `{{ <loop_name>.index }}`— Posisi ordinal dari iterasi saat ini dari loop bernama, yang diindeks di. `0`
+ `{{ <loop_name>.value }}`— Nilai yang terkait dengan variabel iterasi saat ini dari loop bernama.

### Selesaikan ekspresi referensi
<a name="toe-loop-iteration-variables-expressions"></a>

 AWSTOE Mengatasi ekspresi referensi sebagai berikut: 
+ `{{ <loop_name>.* }}`— AWSTOE menyelesaikan ekspresi ini menggunakan logika berikut:
  + Jika loop dari langkah yang sedang berjalan cocok dengan `<loop_name>` nilainya, maka ekspresi referensi menyelesaikan konstruksi perulangan dari langkah yang sedang berjalan.
  + `<loop_name>`menyelesaikan ke konstruksi perulangan bernama jika muncul dalam langkah yang sedang berjalan.
+ `{{ loop.* }}`— AWSTOE menyelesaikan ekspresi menggunakan konstruksi perulangan yang ditentukan dalam langkah yang sedang berjalan.

Jika ekspresi referensi digunakan dalam langkah yang tidak mengandung loop, maka AWSTOE tidak menyelesaikan ekspresi dan mereka muncul di langkah tanpa penggantian. 

**catatan**  
Ekspresi referensi harus diapit tanda kutip ganda untuk ditafsirkan dengan benar oleh kompiler YAMAL.

## Jenis konstruksi perulangan
<a name="toe-loop-types"></a>

Bagian ini memberikan informasi dan contoh tentang jenis konstruksi perulangan yang dapat digunakan dalam. AWSTOE

**Topics**
+ [`for`lingkaran](#toe-loop-types-for)
+ [`forEach`loop dengan daftar input](#toe-loop-types-foreach)
+ [`forEach`loop dengan daftar terbatas](#toe-loop-types-foreach-delimited)

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

`for`Loop iterasi pada rentang bilangan bulat yang ditentukan dalam batas yang diuraikan oleh awal dan akhir variabel. Nilai iterasi ada di set `[start, end]` dan termasuk nilai batas.

AWSTOE memverifikasi`start`,`end`, dan `updateBy` nilai untuk memastikan bahwa kombinasi tidak menghasilkan loop tak terbatas.

`for`skema lingkaran

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


**`for`masukan loop**  

| Bidang | Deskripsi | Tipe | Diperlukan | Default | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nama unik dari loop. Itu harus unik dibandingkan dengan nama loop lain dalam fase yang sama. |  String  |  Tidak  |  ""  | 
|  `start`  | Nilai awal iterasi. Tidak menerima ekspresi rantai.  |  Bilangan Bulat  |  Ya  |  T/A  | 
| `end` | Nilai akhir iterasi. Tidak menerima ekspresi rantai.  | Bilangan Bulat | Ya | T/A | 
| `updateBy` | Perbedaan dimana nilai iterasi diperbarui melalui penambahan. Itu harus nilai negatif atau positif bukan nol. Tidak menerima ekspresi rantai.  | Bilangan Bulat | Ya | T/A | 

`for`contoh masukan loop

```
  - 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
```

### `forEach`loop dengan daftar input
<a name="toe-loop-types-foreach"></a>

`forEach`Loop iterasi pada daftar eksplisit nilai, yang dapat berupa string dan ekspresi dirantai. 

`forEach`loop dengan skema daftar masukan

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


**`forEach`loop dengan masukan daftar masukan**  

| Bidang | Deskripsi | Tipe | Diperlukan | Default | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nama unik dari loop. Itu harus unik dibandingkan dengan nama loop lain dalam fase yang sama. |  String  |  Tidak  |  ""  | 
|  Daftar string loop `forEach`  |  Daftar string untuk iterasi. Menerima ekspresi berantai sebagai string dalam daftar. Ekspresi berantai harus diapit oleh tanda kutip ganda agar kompiler YAMAL dapat menafsirkannya dengan benar.  |  Daftar string  |  Ya  |  T/A  | 

`forEach`loop dengan contoh daftar masukan 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
```

`forEach`loop dengan contoh daftar masukan 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 }}"
```

`forEach`loop dengan contoh daftar masukan 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 }}"
```

### `forEach`loop dengan daftar terbatas
<a name="toe-loop-types-foreach-delimited"></a>

Loop iterasi atas string yang berisi nilai-nilai yang dipisahkan oleh pembatas. Untuk mengulangi konstituen string, AWSTOE gunakan pembatas untuk membagi string menjadi array yang cocok untuk iterasi. 

`forEach`loop dengan skema daftar yang dibatasi

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


**`forEach`loop dengan input daftar yang dibatasi**  

| Bidang | Deskripsi | Tipe | Diperlukan | Default | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nama unik yang diberikan ke loop. Ini harus unik jika dibandingkan dengan nama loop lain dalam fase yang sama. |  String  |  Tidak  |  ""  | 
|  `list`  | String yang terdiri dari string konstituen bergabung dengan karakter pembatas umum. Juga menerima ekspresi dirantai. Dalam kasus ekspresi berantai, pastikan bahwa ekspresi tersebut diapit oleh tanda kutip ganda untuk interpretasi yang benar oleh kompiler YAMAL. | Tali |  Ya  |  T/A  | 
| `delimiter` | Karakter yang digunakan untuk memisahkan string dalam blok. Default adalah karakter koma. Hanya satu karakter pembatas yang diizinkan dari daftar yang diberikan: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/imagebuilder/latest/userguide/toe-looping-constructs.html) Ekspresi rantai tidak dapat digunakan. | String | Tidak | Koma: "," | 

**catatan**  
Nilai diperlakukan sebagai `list` string yang tidak dapat diubah. Jika sumber `list` diubah selama runtime, itu tidak akan tercermin selama menjalankan.

`forEach`loop dengan daftar yang dibatasi contoh 1

Contoh ini menggunakan pola ekspresi rantai berikut untuk merujuk ke output langkah lain:`<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 }}"
```

`forEach`loop dengan contoh daftar terbatas 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 }}"
```

## Bidang langkah
<a name="toe-loop-step-fields"></a>

Loop adalah bagian dari langkah. Bidang apa pun yang terkait dengan menjalankan langkah tidak diterapkan pada iterasi individu. Bidang langkah hanya berlaku pada tingkat langkah, sebagai berikut:
+ *TimeoutSeconds* - Semua iterasi loop harus dijalankan dalam jangka waktu yang ditentukan oleh bidang ini. Jika loop AWSTOE habis waktu, jalankan kebijakan coba lagi langkah tersebut dan setel ulang parameter batas waktu untuk setiap upaya baru. Jika loop run melebihi nilai batas waktu setelah mencapai jumlah maksimum percobaan ulang, pesan kegagalan langkah menyatakan bahwa loop run telah habis waktunya. 
+ *OnFailure* - Penanganan kegagalan diterapkan pada langkah sebagai berikut:
  + Jika *onFailure* disetel ke`Abort`, AWSTOE keluar dari loop dan mencoba ulang langkah sesuai dengan kebijakan coba lagi. Setelah jumlah maksimum percobaan ulang, AWSTOE tandai langkah saat ini sebagai gagal, dan berhenti menjalankan proses.

    AWSTOE menetapkan kode status untuk fase induk dan dokumen ke`Failed`.
**catatan**  
Tidak ada langkah lebih lanjut yang berjalan setelah langkah gagal.
  + Jika *onFailure* disetel ke`Continue`, AWSTOE keluar dari loop dan mencoba ulang langkah sesuai dengan kebijakan coba lagi. Setelah jumlah maksimum percobaan ulang, AWSTOE tandai langkah saat ini sebagai gagal, dan lanjutkan untuk menjalankan langkah berikutnya.

    AWSTOE menetapkan kode status untuk fase induk dan dokumen ke`Failed`.
  + Jika *onFailure* disetel ke`Ignore`, AWSTOE keluar dari loop dan mencoba ulang langkah sesuai dengan kebijakan coba lagi. Setelah jumlah maksimum percobaan ulang, AWSTOE tandai langkah saat ini sebagai`IgnoredFailure`, dan lanjutkan untuk menjalankan langkah berikutnya.

    AWSTOE menetapkan kode status untuk fase induk dan dokumen ke`SuccessWithIgnoredFailure`.
**catatan**  
Ini masih dianggap sebagai proses yang berhasil, tetapi termasuk informasi untuk memberi tahu Anda bahwa satu atau lebih langkah gagal dan diabaikan.
+ *MaxAttracts — Untuk setiap percobaan* ulang, seluruh langkah dan semua iterasi dijalankan dari awal.
+ *status* — Status keseluruhan dari menjalankan langkah. `status`tidak mewakili status iterasi individu. Status langkah dengan loop ditentukan sebagai berikut:
  + Jika iterasi tunggal gagal dijalankan, status langkah menunjuk ke kegagalan.
  + Jika semua iterasi berhasil, status langkah menunjukkan kesuksesan.
+ *StartTime* — Waktu mulai keseluruhan dari menjalankan langkah. Tidak mewakili waktu mulai iterasi individu.
+ *EndTime* — Waktu akhir keseluruhan dari menjalankan langkah. Tidak mewakili waktu akhir iterasi individu.
+ *FailureMessage* — Termasuk indeks iterasi yang gagal jika terjadi kesalahan non-timeout. Jika terjadi kesalahan batas waktu, pesan menyatakan bahwa loop run telah gagal. Pesan kesalahan individual untuk setiap iterasi tidak disediakan untuk meminimalkan ukuran pesan kegagalan.

## Output langkah dan iterasi
<a name="toe-loop-step-output"></a>

Setiap iterasi berisi output. Pada akhir loop run, AWSTOE mengkonsolidasikan semua output iterasi yang berhasil di. `detailedOutput.json` Output konsolidasi adalah pengumpulan nilai yang termasuk dalam kunci output yang sesuai seperti yang didefinisikan dalam skema output modul tindakan. Contoh berikut menunjukkan bagaimana output dikonsolidasikan:

**Output dari `ExecuteBash` untuk Iterasi 1**

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

**Output dari `ExecuteBash` untuk Iterasi 2**

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

**Output dari `ExecuteBash` untuk Langkah**

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

Misalnya,, `ExecuteBash``ExecutePowerShell`, dan `ExecuteBinary` merupakan modul tindakan yang kembali `STDOUT` sebagai output modul tindakan. `STDOUT`pesan digabungkan dengan karakter baris baru untuk menghasilkan output keseluruhan dari langkah masuk`detailedOutput.json`.

AWSTOE tidak akan mengkonsolidasikan output dari iterasi yang gagal.