Author:はひふへ☆ほりりん

名前
ForEach-Object
概要
各入力オブジェクトに対して操作を実行します。
構文
ForEach-Object [-process <ScriptBlock[]>]
[-inputObject <psobject>]
[-begin <scriptblock>]
[-end <scriptblock>]
[<CommonParameters>]
詳細説明
各入力オブジェクトに対して操作を実行します。
入力オブジェクトは、コマンドレットにパイプするか、InputObject パラメータに指定することができます。
実行する操作は、Process パラメータの値としてコマンドレットに提供されるスクリプト ブロック内に記述します。
スクリプト ブロックには、任意の Windows PowerShell スクリプトを記述できます。
スクリプト ブロック内では、現在の入力オブジェクトは $_ 変数で表されます。
各入力オブジェクトに対して実行する操作を記述するスクリプト ブロックの他に、2 つのスクリプト ブロックを作成できます。
2 つのうち、Begin パラメータの値に指定されるスクリプト ブロックは、最初の入力オブジェクトの処理よりも先に実行されます。
End パラメータの値に指定されるもう 1 つのスクリプト ブロックは、最後の入力オブジェクトの処理が完了した後に実行されます。
Begin と End で指定するスクリプト ブロックを含め、すべてのスクリプト ブロックの評価結果がパイプラインを介して渡されます。
パラメータ
-process <ScriptBlock[]>
各入力オブジェクトに適用するスクリプト ブロックを指定します。
必須 true
位置 1
既定値
パイプライン入力を許可する false
ワイルドカード文字を許可する false
-inputObject <psobject>
process パラメータで指定されたスクリプト ブロックの操作対象となるオブジェクトを受け入れます。
オブジェクトを含む変数を入力するか、オブジェクトを取得するコマンドまたは式を入力します。
必須 false
位置 named
既定値
パイプライン入力を許可する true (ByValue)
ワイルドカード文字を許可する false
-begin <scriptblock>
どの入力オブジェクトの処理よりも前に実行するスクリプト ブロックを指定します。
必須 false
位置 named
既定値
パイプライン入力を許可する false
ワイルドカード文字を許可する false
-end <scriptblock>
すべての入力オブジェクトの処理が完了した後に実行するスクリプト ブロックを指定します。
必須 false
位置 named
既定値
パイプライン入力を許可する false
ワイルドカード文字を許可する false
<CommonParameters>
このコマンドレットは、次の共通パラメータをサポートします: -Verbose、-Debug、
-ErrorAction、-ErrorVariable、および -OutVariable。詳細については、
「get-help about_commonparameters」と入力してヘルプを参照してください。
入力の種類
Object
戻り値の型
メモ
詳細を参照するには、「Get-Help ForEach-Object -detailed」と入力してください。
技術情報を参照するには、「Get-Help ForEach-Object -full」と入力してください。
パラメータに複数の値を指定するときは、各値をコンマで区切ります。
たとえば、"<パラメータ名> <値 1>, <値 2>" と指定します。
-------------------------- 例 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
$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();}
このコマンドは、複数のレジストリ エントリを Set-ItemProperty コマンドレットを使用して更新します。
これらのレジストリ エントリは、コンピュータ上に割り当てられたネットワーク ドライブの UNC パスを指定しています。
このコマンドは、UNC パスの文字を大文字に変更します。
現実のシナリオでは、パスのサーバー名やその他のコンポーネントを変更しなければならない場合があります。
Set-ItemProperty コマンドレットの操作対象は 1 つのプロパティであるため、ForEach-Object コマンドレットを使用して、
変更するプロパティ (この場合はレジストリ エントリ) ごとに Set-ItemProperty が呼び出されます。
レジストリ エントリの名前は RemotePath で、HKCU\Network\<割り当てられたドライブ文字> にあります。
レジストリ・エントリは Get-ItemProperty コマンドレットを使用して取得され、ForEach-Object への入力としてパイプされます。
ForEach-Object 内で Set-ItemProperty を呼び出すときの $_ 変数には、現在処理中のレジストリ エントリの参照が保持されています。
PSPath プロパティの値は、現在のエントリを含むレジストリ キーです。
RemotePath プロパティは System.String 型で、エントリの値を大文字に変更するために使用する ToUpper メソッドを含みます。
関連するリンク
Where-Object
Compare-Object
Group-Object
Select-Object
Sort-Object
<< 【コマンド】Where-Object | ホーム | 【コマンド】Write-Host >>
コメントの投稿