about_For
Deskripsi singkat
Menjelaskan perintah bahasa yang dapat Anda gunakan untuk menjalankan pernyataan berdasarkan pengujian kondisional.
Deskripsi panjang
Pernyataan For
(juga dikenal sebagai perulangan For
) adalah konstruksi bahasa yang dapat Anda gunakan untuk membuat perulangan yang menjalankan perintah dalam blok perintah sementara kondisi tertentu mengevaluasi ke $true
.
Penggunaan umum perulangan For
adalah untuk mengulangi array nilai dan untuk beroperasi pada subset nilai-nilai ini. Dalam kebanyakan kasus, jika Anda ingin melakukan iterasi semua nilai dalam array, pertimbangkan untuk Foreach
menggunakan pernyataan.
Sintaks
Berikut ini memperlihatkan For
sintaks pernyataan.
for (<Init>; <Condition>; <Repeat>)
{
<Statement list>
}
Tempat penampung Init mewakili satu atau beberapa perintah yang dijalankan sebelum perulangan dimulai. Anda biasanya menggunakan bagian Init dari pernyataan untuk membuat dan menginisialisasi variabel dengan nilai awal.
Variabel ini kemudian akan menjadi dasar untuk kondisi yang akan diuji dalam bagian berikutnya dari For
pernyataan.
Tempat penampung Kondisi mewakili bagian dari For
pernyataan yang diselesaikan ke $true
nilai atau $false
Boolean . PowerShell mengevaluasi kondisi setiap kali perulangan For
berjalan. Jika pernyataannya adalah $true
, perintah dalam blok perintah dijalankan, dan pernyataan dievaluasi lagi. Jika kondisi masih $true
, perintah dalam daftar Pernyataan berjalan lagi.
Perulangan diulang sampai kondisi menjadi $false
.
Tempat penampung Ulangi mewakili satu atau beberapa perintah, dipisahkan oleh koma, yang dijalankan setiap kali perulangan diulang. Biasanya, ini digunakan untuk memodifikasi variabel yang diuji di dalam bagian Kondisi dari pernyataan.
Tempat penampung daftar Pernyataan mewakili sekumpulan satu atau beberapa perintah yang dijalankan setiap kali perulangan dimasukkan atau diulang. Konten daftar Pernyataan dikelilingi oleh kurung kurawal.
Dukungan untuk beberapa operasi
Sintaks berikut didukung untuk beberapa operasi penetapan dalam pernyataan Init :
# Comma separated assignment expressions enclosed in parentheses.
for (($i = 0), ($j = 0); $i -lt 10; $i++)
{
"`$i:$i"
"`$j:$j"
}
# Sub-expression using the semicolon to separate statements.
for ($($i = 0;$j = 0); $i -lt 10; $i++)
{
"`$i:$i"
"`$j:$j"
}
Sintaks berikut didukung untuk beberapa operasi penetapan dalam pernyataan Ulangi :
# Comma separated assignment expressions.
for (($i = 0), ($j = 0); $i -lt 10; $i++, $j++)
{
"`$i:$i"
"`$j:$j"
}
# Comma separated assignment expressions enclosed in parentheses.
for (($i = 0), ($j = 0); $i -lt 10; ($i++), ($j++))
{
"`$i:$i"
"`$j:$j"
}
# Sub-expression using the semicolon to separate statements.
for ($($i = 0;$j = 0); $i -lt 10; $($i++;$j++))
{
"`$i:$i"
"`$j:$j"
}
Catatan
Operasi selain kenaikan pra atau pasca mungkin tidak berfungsi dengan semua sintaks.
Untuk beberapa Kondisi , gunakan operator logis seperti yang ditunjukkan oleh contoh berikut.
for (($i = 0), ($j = 0); $i -lt 10 -and $j -lt 10; $i++,$j++)
{
"`$i:$i"
"`$j:$j"
}
Untuk informasi selengkapnya, lihat about_Logical_Operators.
Contoh sintaks
Minimal, For
pernyataan memerlukan tanda kurung di sekitar bagian Init, Condition, dan Repeat dari pernyataan dan perintah yang dikelilingi oleh kurung kurawal di bagian Daftar pernyataan.
Perhatikan bahwa contoh yang akan datang sengaja menampilkan kode di luar For
pernyataan. Dalam contoh selanjutnya, kode diintegrasikan ke For
dalam pernyataan.
Misalnya, pernyataan berikut For
terus menampilkan nilai $i
variabel hingga Anda keluar dari perintah secara manual dengan menekan CTRL+C.
$i = 1
for (;;)
{
Write-Host $i
}
Anda dapat menambahkan perintah tambahan ke daftar pernyataan sehingga nilai $i
bertambah 1 setiap kali perulangan dijalankan, seperti yang ditunjukkan contoh berikut.
for (;;)
{
$i++; Write-Host $i
}
Hingga Anda keluar dari perintah dengan menekan CTRL+C, pernyataan ini akan terus menampilkan nilai $i
variabel karena bertambah 1 setiap kali perulangan dijalankan.
Daripada mengubah nilai variabel dalam bagian daftar pernyataan dari For
pernyataan, Anda dapat menggunakan bagian Ulangi dari For
pernyataan sebagai gantinya, sebagai berikut.
$i=1
for (;;$i++)
{
Write-Host $i
}
Pernyataan ini masih akan berulang tanpa batas waktu sampai Anda keluar dari perintah dengan menekan CTRL+C.
Anda dapat mengakhiri perulangan For
menggunakan kondisi. Anda dapat menempatkan kondisi menggunakan bagian For
Kondisi pernyataan. Perulangan For
berakhir ketika kondisi mengevaluasi ke $false
.
Dalam contoh berikut, perulangan For
berjalan sementara nilai kurang dari $i
atau sama dengan 10.
$i=1
for(;$i -le 10;$i++)
{
Write-Host $i
}
Alih-alih membuat dan menginisialisasi variabel di luar For
pernyataan, Anda dapat melakukan tugas ini di dalam For
perulangan dengan menggunakan bagian Init dari For
pernyataan.
for($i=1; $i -le 10; $i++){Write-Host $i}
Anda dapat menggunakan pengembalian operator alih-alih titik koma untuk memisahkan bagian For
Init, Kondisi, dan Ulangi pernyataan. Contoh berikut menunjukkan For
yang menggunakan sintaks alternatif ini.
for ($i = 0
$i -lt 10
$i++){
$i
}
Bentuk For
alternatif pernyataan ini berfungsi dalam file skrip PowerShell dan di prompt perintah PowerShell. Namun, lebih mudah untuk menggunakan For
sintaks pernyataan dengan titik koma saat Anda memasukkan perintah interaktif pada prompt perintah.
Perulangan For
lebih fleksibel daripada Foreach
perulangan karena memungkinkan Anda untuk menaikkan nilai dalam array atau koleksi dengan menggunakan pola. Dalam contoh berikut, $i
variabel bertambah 2 dalam bagian For
Ulangi pernyataan.
for ($i = 0; $i -le 20; $i += 2)
{
Write-Host $i
}
Perulangan For
juga dapat ditulis pada satu baris seperti dalam contoh berikut.
for ($i = 0; $i -lt 10; $i++) { Write-Host $i }
Contoh fungsi
Contoh berikut menunjukkan bagaimana Anda dapat menggunakan perulangan For
untuk melakukan iterasi melalui array file dan mengganti namanya. File dalam work_items
folder memiliki ID item kerjanya sebagai nama file. Perulangan berulang melalui file untuk memastikan bahwa nomor ID adalah nol-padded ke lima digit.
Pertama, kode mengambil daftar file data item kerja. Mereka semua file JSON yang menggunakan format <work-item-type>-<work-item-number>
untuk namanya.
Dengan objek info file yang disimpan ke $fileList
variabel, Anda dapat mengurutkannya berdasarkan nama dan melihat bahwa saat item dikelompokkan menurut jenis, urutan item menurut ID tidak terduga.
$fileList = Get-ChildItem -Path ./work_items
$fileList | Sort-Object -Descending -Property Name
bug-219.json
bug-41.json
bug-500.json
bug-697.json
bug-819.json
bug-840.json
feat-176.json
feat-367.json
feat-373.json
feat-434.json
feat-676.json
feat-690.json
feat-880.json
feat-944.json
maint-103.json
maint-367.json
maint-454.json
maint-49.json
maint-562.json
maint-579.json
Untuk memastikan bahwa Anda dapat mengurutkan item kerja secara alfanumerik, nomor item kerja harus nol-padded.
Kode melakukan ini dengan terlebih dahulu mencari item kerja dengan akhiran numerik terpanjang. Ini mengulangi file menggunakan perulangan for
, menggunakan indeks untuk mengakses setiap file dalam array. Ini membandingkan setiap nama file dengan pola ekspresi reguler untuk mengekstrak nomor item kerja sebagai string, bukan bilangan bulat. Kemudian membandingkan panjang nomor item kerja untuk menemukan angka terpanjang.
# Default the longest numeral count to 1, since it can't be smaller.
$longestNumeralCount = 1
# Regular expression to find the numerals in the filename - use a template
# to simplify updating the pattern as needed.
$patternTemplate = '-(?<WorkItemNumber>{{{0},{1}}})\.json'
$pattern = $patternTemplate -f $longestNumeralCount
# Iterate, checking the length of the work item number as a string.
for (
$i = 0 # Start at zero for first array item.
$i -lt $fileList.Count # Stop on the last item in the array.
$i++ # Increment by one to step through the array.
) {
if ($fileList[$i].Name -match $pattern) {
$numeralCount = $Matches.WorkItemNumber.Length
if ($numeralCount -gt $longestNumeralCount) {
# Count is higher, check against it for remaining items.
$longestNumeralCount = $numeralCount
# Update the pattern to speed up the search, ignoring items
# with a smaller numeral count using pattern matching.
$pattern = $patternTemplate -f $longestNumeralCount
}
}
}
Sekarang setelah Anda mengetahui jumlah angka maksimum untuk item kerja, Anda dapat mengulangi file untuk mengganti namanya sesuai kebutuhan. Cuplikan kode berikutnya berulang kali melalui daftar file lagi, padding sesuai kebutuhan. Ini menggunakan pola ekspresi reguler lain untuk hanya memproses file dengan jumlah angka yang lebih kecil dari maksimum.
# Regular expression to find the numerals in the filename, but only if the
# numeral count is smaller than the longest numeral count.
$pattern = $patternTemplate -f 1, ($longestNumeralCount - 1)
for (
$i = 0 # Start at zero for first array item.
$i -lt $fileList.Count # Stop on the last item in the array.
$i++ # Increment by one to step through the array.
) {
# Get the file from the array to process
$file = $fileList[$i]
# If the file doesn't need to be renamed, continue to the next file
if ($file.Name -notmatch $pattern) {
continue
}
# Get the work item number from the regular expression, create the
# padded string from it, and define the new filename by replacing
# the original number string with the padded number string.
$workItemNumber = $Matches.WorkItemNumber
$paddedNumber = "{0:d$longestNumeralCount}" -f $workItemNumber
$paddedName = $file.Name -replace $workItemNumber, $paddedNumber
# Rename the file with the padded work item number.
$file | Rename-Item -NewName $paddedName
}
Sekarang setelah file diganti namanya, Anda dapat mengambil daftar file lagi dan mengurutkan file lama dan baru berdasarkan nama. Cuplikan berikut mengambil file lagi untuk disimpan dalam array baru dan membandingkan dengan kumpulan objek awal. Kemudian mengurutkan kedua array file, menyimpan array yang diurutkan ke dalam variabel $sortedOriginal
baru dan $sortedPadded
. Terakhir, ia menggunakan perulangan for
untuk melakukan iterasi pada array dan menghasilkan objek dengan properti berikut:
- Indeks mewakili indeks saat ini dalam array yang diurutkan.
- Asli adalah item dalam array yang diurutkan dari nama file asli pada indeks saat ini.
- Padded adalah item dalam array yang diurutkan dari nama file yang diisi pada indeks saat ini.
$paddedList = Get-ChildItem -path ./work_items
# Sort both file lists by name.
$sortedOriginal = $fileList | Sort-Object -Property Name
$sortedPadded = $renamedList | Sort-Object -Property Name
# Iterate over the arrays and output an object to simplify comparing how
# the arrays were sorted before and after padding the work item numbers.
for (
$i = 0
$i -lt $fileList.Count
$i++
) {
[pscustomobject] @{
Index = $i
Original = $sortedOriginal[$i].Name
Padded = $sortedPadded[$i].Name
}
}
Index Original Padded
----- -------- ------
0 bug-219.json bug-00041.json
1 bug-41.json bug-00219.json
2 bug-500.json bug-00500.json
3 bug-697.json bug-00697.json
4 bug-819.json bug-00819.json
5 bug-840.json bug-00840.json
6 feat-176.json feat-00176.json
7 feat-367.json feat-00367.json
8 feat-373.json feat-00373.json
9 feat-434.json feat-00434.json
10 feat-676.json feat-00676.json
11 feat-690.json feat-00690.json
12 feat-880.json feat-00880.json
13 feat-944.json feat-00944.json
14 maint-103.json maint-00049.json
15 maint-367.json maint-00103.json
16 maint-454.json maint-00367.json
17 maint-49.json maint-00454.json
18 maint-562.json maint-00562.json
19 maint-579.json maint-00579.json
Dalam output, item kerja yang diurutkan setelah padding berada dalam urutan yang diharapkan.