ForEach-Object
各入力オブジェクトに対して操作を実行します。
構文
ForEach-Object [-Process] <ScriptBlock[]> [-Begin <scriptblock>] [-End <scriptblock>] [-InputObject <psobject>] [<CommonParameters>]
説明
ForEach-Object コマンドレットは、各入力オブジェクトに対して操作を実行します。入力オブジェクトは、コマンドレットにパイプするか、InputObject パラメーターに指定することができます。
実行する操作は、Process パラメーターの値としてコマンドレットに提供されるスクリプト ブロック内に記述します。スクリプト ブロックには、任意の Windows PowerShell スクリプトを記述できます。
スクリプト ブロック内では、現在の入力オブジェクトは $_ 変数で表されます。
各入力オブジェクトに対して実行する操作を記述したスクリプト ブロックを使用するだけでなく、2 つのスクリプト ブロックを追加で作成することもできます。2 つのうち、Begin パラメーターの値に指定されるスクリプト ブロックは、最初の入力オブジェクトの処理よりも先に実行されます。End パラメーターの値に指定されるもう 1 つのスクリプト ブロックは、最後の入力オブジェクトの処理が完了した後に実行されます。
Begin と End で指定するスクリプト ブロックを含め、すべてのスクリプト ブロックの評価結果がパイプラインを介して渡されます。
パラメーター
-Begin <scriptblock>
どの入力オブジェクトの処理よりも前に実行するスクリプト ブロックを指定します。
必須 |
false |
位置 |
named |
既定値 |
|
パイプライン入力を許可する |
false |
ワイルドカード文字を許可する |
false |
-End <scriptblock>
すべての入力オブジェクトの処理が完了した後に実行するスクリプト ブロックを指定します。
必須 |
false |
位置 |
named |
既定値 |
|
パイプライン入力を許可する |
false |
ワイルドカード文字を許可する |
false |
-InputObject <psobject>
process パラメーターで指定されたスクリプト ブロックの操作対象となるオブジェクトを受け入れます。オブジェクトが格納されている変数を入力するか、オブジェクトを取得するコマンドまたは式を入力します。
必須 |
false |
位置 |
named |
既定値 |
|
パイプライン入力を許可する |
true (ByValue) |
ワイルドカード文字を許可する |
false |
-Process <ScriptBlock[]>
各入力オブジェクトに適用するスクリプト ブロックを指定します。
必須 |
true |
位置 |
1 |
既定値 |
|
パイプライン入力を許可する |
false |
ワイルドカード文字を許可する |
false |
<CommonParameters>
このコマンドレットは、次の共通パラメーターをサポートします: -Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer、および -OutVariable。詳細については、次を参照してください: about_Commonparameters.
入力と出力
入力値の型は、コマンドレットへのパイプが可能なオブジェクトの型です。戻り値の型は、コマンドレットによって返されるオブジェクトの型です。
入力 |
System.Management.Automation.PSObject パイプを使用して、あらゆるオブジェクトを ForEach-Object に渡すことができます。 |
出力 |
System.Management.Automation.PSObject ForEach-Object によって返されるオブジェクトは、入力によって決まります。 |
例 1
C:\PS>30000,56798,12432 | foreach-object -process {$_/1024}
説明
-----------
このコマンドは、整数の配列を受け取り、各配列要素を 1024 で除算して結果を表示します。
例 2
C:\PS>get-childitem C:\ | foreach-object -process { $_.length / 1024 }
説明
-----------
このコマンドは、C: ドライブのルートにあるすべてのファイルとディレクトリを取得し、それぞれのサイズを表示します。0 は、ファイル サイズを取得できなかったディレクトリを表します。
例 3
C:\PS>$events = get-eventlog -logname system -newest 1000
C:\PS> $events | foreach-object -begin {get-date} -process {out-file -filepath events.txt -append -inputobject $_.message} -end {get-date}
説明
-----------
このコマンドは、システム ログから最新のイベントを 1000 個取得し、$events 変数に保存します。次に、パイプを使用して、そのイベントを ForEach-Object コマンドレットに渡します。Begin パラメーターによって現在の日付と時刻が表示されます。次に、Process パラメーターの Out-File コマンドレットが実行されます。これにより、events.txt という名前のテキスト ファイルが作成され、各イベントの message プロパティがそのファイルに保存されます。最後に、End パラメーターによってすべての処理が完了した後の日付と時刻が表示されます。
例 4
C:\PS>get-itemproperty -path hkcu:\Network\* | foreach-object {set-itemproperty -path $_.pspath -name RemotePath -value $_.RemotePath.ToUpper();}
説明
-----------
このコマンドは、HKCU:\Network キーの下にあるすべてのサブキーの RemotePath レジストリ エントリ値を大文字のテキストに変更します。このコマンド形式を使用して、レジストリ エントリ値の形式または内容を変更できます。
Network キーの各サブキーは、ログオン時に再接続されるマッピングされたネットワーク ドライブを表します。RemotePath エントリには、接続されたドライブの UNC パスが含まれます。たとえば、E: ドライブを \\Server\Share にマッピングした場合、HKCU:\Network に E サブキーが作成され、E サブキーの RemotePath レジストリ エントリの値は \\Server\Share となります。
このコマンドは、Get-ItemProperty コマンドレットを使用して Network キーのすべてのサブキーを取得し、Set-ItemProperty コマンドレットを使用して各キーの RemotePath レジストリ エントリの値を変更します。Set-ItemProperty コマンドでは、このパスはレジストリ キーの PSPath プロパティの値です (これは、レジストリ キーを表す Microsoft .NET Framework オブジェクトのプロパティであり、レジストリ エントリではありません)。このコマンドは、RemotePath の値の ToUpper() メソッドを使用します。これは文字列 (REG_SZ) です。
Set-ItemProperty が各キーのプロパティを変更しているため、プロパティにアクセスするには ForEach-Object コマンドレットが必要です。