サーチ…
前書き
ループとは、特定の条件に達するまで継続的に繰り返される一連の命令です。あなたのプログラムがコードブロックを繰り返し実行できるようにすることは、プログラミングの最も基本的ではあるが有用なタスクの1つです。ループを使用すると、非常に単純なステートメントを書くことができます。条件に達した場合、次の命令は次のシーケンシャル命令に「分岐」するか、またはループ外に分岐します。
構文
(<Initialization>; <Condition>; <Repetition>){<Script_Block>}
<コレクション> | Foreach-Object {<Script_Block_with _ $ __ as_current_item>}
foreach(<Collection>内の<Item>){<Script_Block>}
while(<条件>){<Script_Block>}
while {<Script_Block>} while(<Condition>)
(<Condition>)まで{{Script_Block>}してください
<コレクション> .foreach({<Script_Block_with _ $ __ as_current_item>})
備考
フォアハ
PowerShellでforeach-loopを実行するには、複数の方法があり、それぞれ独自の長所と短所があります。
溶液 | 利点 | 短所 |
---|---|---|
Foreachステートメント | 最速。静的コレクション(変数に格納されている)に最も適しています。 | パイプライン入力または出力なし |
ForEach()メソッド | Foreach-Object と同じスクリプトブロック構文ですが、高速です。静的コレクション(変数に格納されている)に最も適しています。パイプライン出力をサポートします。 | パイプライン入力はサポートされていません。 PowerShell 4.0以上が必要 |
Foreach-Object(コマンドレット) | パイプライン入出力をサポートします。接続の初期化と終了のための開始と終了スクリプトブロックをサポートします。最も柔軟なソリューション。 | 最も遅い |
パフォーマンス
$foreach = Measure-Command { foreach ($i in (1..1000000)) { $i * $i } }
$foreachmethod = Measure-Command { (1..1000000).ForEach{ $_ * $_ } }
$foreachobject = Measure-Command { (1..1000000) | ForEach-Object { $_ * $_ } }
"Foreach: $($foreach.TotalSeconds)"
"Foreach method: $($foreachmethod.TotalSeconds)"
"ForEach-Object: $($foreachobject.TotalSeconds)"
Example output:
Foreach: 1.9039875
Foreach method: 4.7559563
ForEach-Object: 10.7543821
Foreach-Object
は最も遅いですが、パイプラインサポートは、到着時にアイテムを処理できるように(ファイルの読み取り中、データの受信中など)役立ちます。これは、処理前にすべてのデータをメモリにロードする必要がないため、大きなデータと低いメモリで作業する場合に非常に便利です。
にとって
for($i = 0; $i -le 5; $i++){
"$i"
}
forループの典型的な使い方は、配列内の値のサブセットを操作することです。ほとんどの場合、配列内のすべての値を反復処理する場合は、foreach文の使用を検討してください。
フォアハ
ForEach
は、PowerShellでは2つの異なる意味を持ちます。 1つはキーワードで、もう1つはForEach-Objectコマンドレットのエイリアスです。ここでは前者について説明します。
この例では、配列内のすべての項目をコンソールホストに出力する方法を示します。
$Names = @('Amy', 'Bob', 'Celine', 'David')
ForEach ($Name in $Names)
{
Write-Host "Hi, my name is $Name!"
}
この例では、ForEachループの出力をキャプチャする方法を示します。
$Numbers = ForEach ($Number in 1..20) {
$Number # Alternatively, Write-Output $Number
}
最後の例と同様に、この例ではループを格納する前に配列を作成する方法を示します。
$Numbers = @()
ForEach ($Number in 1..20)
{
$Numbers += $Number
}
中
whileループは条件を評価し、trueならアクションを実行します。条件が真と評価される限り、アクションは引き続き実行されます。
while(condition){
code_block
}
次の例では、10から0にカウントダウンするループを作成します
$i = 10
while($i -ge 0){
$i
$i--
}
Do
-Whileループとは異なり、条件はアクションの最初の実行の前に評価されます。初期条件がfalseと評価された場合、アクションは実行されません。
注:条件を評価するとき、PowerShellは戻りオブジェクトの存在をtrueとして扱います。これはいくつかの方法で使用できますが、以下はプロセスを監視する例です。この例では、メモ帳プロセスが起動され、そのプロセスが実行されている限り、現在のシェルをスリープします。メモ帳インスタンスを手動で閉じると、while条件が失敗し、ループが壊れます。
Start-Process notepad.exe
while(Get-Process notepad -ErrorAction SilentlyContinue){
Start-Sleep -Milliseconds 500
}
ForEach-Object
ForEach-Object
コマンドレットはforeach
ステートメントと同様にForEach-Object
しますが、パイプラインからの入力を受け取ります。
基本的な使用法
$object | ForEach-Object {
code_block
}
例:
$names = @("Any","Bob","Celine","David")
$names | ForEach-Object {
"Hi, my name is $_!"
}
Foreach-Object
は、2つのデフォルトの別名foreach
と%
(簡略構文)があります。 foreach
がforeach文と混同される可能性があるため、最も一般的なものは%
です。例:
$names | % {
"Hi, my name is $_!"
}
$names | foreach {
"Hi, my name is $_!"
}
高度な使い方
Foreach-Object
は、パイプラインを使用するように設計されたコマンドレットであるため、代わりのforeach
ソリューションから際立っています。このため、cmdletや高度な機能と同様に、3つのスクリプトブロックをサポートしています。
- Begin :パイプラインから到着したアイテムをループする前に一度実行します。通常、ループで使用する関数の作成、変数の作成、接続のオープン(データベース、Web +など)などに使用されます。
- プロセス :パイプラインから到着したアイテムごとに1回実行されます。コードブロックの "通常"です。これは、パラメータが指定されていない場合の上記の例で使用されるデフォルトです。
- 終了 :すべてのアイテムを処理した後に1回実行します。通常、接続を閉じたり、レポートを生成するために使用されます。
例:
"Any","Bob","Celine","David" | ForEach-Object -Begin {
$results = @()
} -Process {
#Create and store message
$results += "Hi, my name is $_!"
} -End {
#Count messages and output
Write-Host "Total messages: $($results.Count)"
$results
}
行う
Do-Loopは、コードブロックを少なくとも1回は常に実行したい場合に便利です。 Do-loopは、コードブロックを実行する前に実行するwhile-loopとは異なり、コードブロックを実行した後の状態を評価します。
do-loopsは次の2つの方法で使用できます。
条件が満たされている間ループする:
Do { code_block } while (condition)
条件が真になるまでループします。つまり、条件がfalseのときにループします。
Do { code_block } until (condition)
実際の例:
$i = 0
Do {
$i++
"Number $i"
} while ($i -ne 3)
Do {
$i++
"Number $i"
} until ($i -eq 3)
Do-WhileとDo-Untilは反復ループです。同じコード内にある場合、条件は逆になります。上記の例は、この動作を示しています。
ForEach()メソッド
代わりForEach-Object
レット、ここで使用する可能性もあるForEach
ようなので、オブジェクト列に直接方法は
(1..10).ForEach({$_ * $_})
または - 必要に応じて、スクリプトブロックのまわりの括弧を省略することができます
(1..10).ForEach{$_ * $_}
どちらも下の出力になります
1
4
9
16
25
36
49
64
81
100
持続する
Continue
演算子はFor
、 ForEach
、 While
およびDo
ループでForEach
Do
ます。ループの現在の反復をスキップし、最も内側のループの先頭にジャンプします。
$i =0
while ($i -lt 20) {
$i++
if ($i -eq 7) { continue }
Write-Host $I
}
上記はコンソールに1から20を出力しますが、番号7を逃します。
注意 :パイプラインループを使用する場合は、 Continue
ではなく「 return
」を使用する必要があります。
ブレーク
break
演算子は、すぐにプログラムループを終了します。 For
、 ForEach
、 While
およびDo
ループまたはSwitch
ステートメントで使用できます。
$i = 0
while ($i -lt 15) {
$i++
if ($i -eq 7) {break}
Write-Host $i
}
上記は15にカウントされますが、7に達するとすぐに停止します。
注 :パイプラインループを使用する場合、 break
はcontinue
ように動作します。パイプラインループのbreak
をシミュレートbreak
は、追加のロジック、コマンドレットなどを組み込む必要があります。 break
を使用する必要がある場合は、非パイプラインループを使用する方が簡単です。
ブレークラベル
Breakは、ループのインスタンス化の前に置かれたラベルを呼び出すこともできます。
$i = 0
:mainLoop While ($i -lt 15) {
Write-Host $i -ForegroundColor 'Cyan'
$j = 0
While ($j -lt 15) {
Write-Host $j -ForegroundColor 'Magenta'
$k = $i*$j
Write-Host $k -ForegroundColor 'Green'
if ($k -gt 100) {
break mainLoop
}
$j++
}
$i++
}
注:このコードは、 $i
を8
、 $j
を13
に増やし、 $k
が104
ます。 $k
が100
超えているので、コードは両方のループから抜け出します。