about_For
簡単な説明
条件付きテストに基づいてステートメントを実行するために使用できる言語コマンドについて説明します。
詳細な説明
For
ステートメント (ループとも呼ばれますFor
) は、指定された条件が評価される間にコマンド ブロックでコマンドを実行するループを作成するために使用できる言語コンストラクトです$true
。
ループの For
一般的な用途は、値の配列を反復処理し、これらの値のサブセットを操作することです。 ほとんどの場合、配列内のすべての値を反復処理する場合は、ステートメントの使用を Foreach
検討してください。
構文
ステートメントの構文を次に For
示します。
for (<Init>; <Condition>; <Repeat>)
{
<Statement list>
}
Init プレースホルダーは、ループが開始される前に実行される 1 つ以上のコマンドを表します。 通常、ステートメントの Init 部分を使用して、開始値を使用して変数を作成および初期化します。
この変数は、ステートメントの次の部分でテストされる条件の For
基礎になります。
Condition プレースホルダーは、ステートメントの中でFor
、ブール値または$false
ブール$true
値に解決される部分を表します。 PowerShell は、ループが実行されるたびに条件を For
評価します。 ステートメントが指定されている場合は $true
、コマンド ブロック内のコマンドが実行され、ステートメントが再び評価されます。 条件がまだ残っている$true
場合は、ステートメントリストのコマンドが再度実行されます。
ループは条件になるまで繰り返されます $false
。
Repeat プレースホルダーは 、ループが繰り 返されるたびに実行される 1 つ以上のコマンドをコンマで区切って表します。 通常、これは、ステートメントの Condition 部分内でテストされる変数を変更するために使用されます。
ステートメント リスト プレースホルダーは、ループが入力または繰り返されるたびに実行される 1 つ以上のコマンドのセットを表します。 ステートメント リストの内容は中かっこで囲まれています。
複数の操作のサポート
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"
}
Repeat ステートメントの複数の割り当て操作では、次の構文がサポートされています。
# 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"
}
Note
事前インクリメントまたは事後インクリメント以外の操作は、すべての構文で機能しない場合があります。
複数 の条件 の場合は、次の例に示すように論理演算子を使用します。
for (($i = 0), ($j = 0); $i -lt 10 -and $j -lt 10; $i++,$j++)
{
"`$i:$i"
"`$j:$j"
}
詳細については、「about_Logical_Operators」を参照してください。
構文の例
少なくとも、ステートメントには、For
ステートメントの Init、Condition、Repeat の一部を囲むかっこと、ステートメントのステートメント リスト部分の中かっこで囲まれたコマンドが必要です。
今後の例では、ステートメントの外側に意図的にコードが For
表示されることに注意してください。 後の例では、コードがステートメントに For
統合されています。
たとえば、次 For
のステートメントは、Ctrl キーを押しながら C キーを $i
押してコマンドを手動で中断するまで、変数の値を継続的に表示します。
$i = 1
for (;;)
{
Write-Host $i
}
次の例に示すように、ループが実行されるたびに値 $i
が 1 ずつインクリメントされるように、ステートメント リストにコマンドを追加できます。
for (;;)
{
$i++; Write-Host $i
}
Ctrl キーを押しながら C キーを押してコマンドを中断するまで、このステートメントは、ループが実行されるたびに 1 ずつインクリメントされるため、変数の $i
値を継続的に表示します。
ステートメントのステートメント リスト部分For
の変数の値を変更する代わりに、次のようにステートメントの Repeat 部分をFor
使用できます。
$i=1
for (;;$i++)
{
Write-Host $i
}
このステートメントは、Ctrl キーを押しながら C キーを押してコマンドから抜け出すまで、無期限に繰り返されます。
条件を使用してループをFor
終了できます。 条件は、ステートメントの Condition 部分For
を使用して配置できます。 条件が For
次の値に評価されると、ループは終了します $false
。
次の例では、値$i
が For
10 以下の間にループが実行されます。
$i=1
for(;$i -le 10;$i++)
{
Write-Host $i
}
ステートメントの外部For
で変数を作成して初期化する代わりに、ステートメントの Init 部分をFor
使用してループ内でこのタスクをFor
実行できます。
for($i=1; $i -le 10; $i++){Write-Host $i}
セミコロンの代わりに復帰を使用して、ステートメントの Init、Condition、Repeat の部分をFor
区切ることができます。 次の例は、この代替構文を For
使用する例を示しています。
for ($i = 0
$i -lt 10
$i++){
$i
}
この別の形式のステートメントは For
、PowerShell スクリプト ファイルと PowerShell コマンド プロンプトで機能します。 ただし、コマンド プロンプトで対話型コマンドを For
入力する場合は、セミコロンでステートメント構文を使用する方が簡単です。
ループは For
、パターンを Foreach
使用して配列またはコレクション内の値をインクリメントできるため、ループよりも柔軟性が高くなります。 次の例では、ステートメントの $i
Repeat 部分For
で変数が 2 ずつインクリメントされます。
for ($i = 0; $i -le 20; $i += 2)
{
Write-Host $i
}
ループは For
、次の例のように 1 行に記述することもできます。
for ($i = 0; $i -lt 10; $i++) { Write-Host $i }
機能の例
次の例では、ループを使用 For
してファイルの配列を反復処理し、名前を変更する方法を示します。 フォルダー内のファイルには、 work_items
ファイル名として作業項目 ID があります。 ループはファイルを反復処理して、ID 番号が 0 から 5 桁に埋め込まれるようにします。
最初に、コードは作業項目データ ファイルの一覧を取得します。 これらはすべて、名前の形式 <work-item-type>-<work-item-number>
を使用する JSON ファイルです。
変数に $fileList
保存されたファイル情報オブジェクトを名前で並べ替えることで、項目が種類別にグループ化されている間、ID による項目の順序が予期しないことがわかります。
$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
作業項目を英数字で並べ替えられるようにするには、作業項目番号をゼロで埋め込む必要があります。
コードは、最初に最も長い数値サフィックスを持つ作業項目を検索することによってこれを行います。 ループを使用して for
ファイルをループ処理し、インデックスを使用して配列内の各ファイルにアクセスします。 各ファイル名を正規表現パターンと比較して、作業項目番号を整数ではなく文字列として抽出します。 次に、作業項目番号の長さを比較して、最も長い番号を検索します。
# 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
}
}
}
作業項目の最大数がわかったら、ファイルをループして必要に応じて名前を変更できます。 次のコード スニペットでは、ファイル リストを再度反復処理し、必要に応じて埋め込みます。 別の正規表現パターンを使用して、数値カウントが最大値より小さいファイルのみを処理します。
# 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
}
ファイルの名前が変更されたので、ファイルの一覧をもう一度取得し、古いファイルと新しいファイルの両方を名前で並べ替えることができます。 次のスニペットは、新しい配列に保存し、オブジェクトの初期セットと比較するために、ファイルをもう一度取得します。 次に、ファイルの両方の配列を並べ替え、並べ替えられた配列を新しい変数 $sortedOriginal
に保存します $sortedPadded
。 最後に、ループを for
使用して配列を反復処理し、次のプロパティを持つオブジェクトを出力します。
- Index は、並べ替えられた配列の現在のインデックスを表します。
- Original は、現在のインデックスにある元のファイル名の並べ替えられた配列内の項目です。
- Padded は、現在のインデックスにある埋め込まれたファイル名の並べ替えられた配列内の項目です。
$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
出力では、埋め込みの後に並べ替えられた作業項目は想定された順序になります。
関連項目
PowerShell