ForEach-Object
入力オブジェクトのコレクション内の各項目に対して操作を実行します。
構文
ForEach-Object
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-Process] <ScriptBlock[]>
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ForEach-Object
[-InputObject <PSObject>]
[-MemberName] <String>
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
説明
ForEach-Object コマンドレットは、入力オブジェクトのコレクション内の各項目に対して操作を実行します。 入力オブジェクトは、コマンドレットにパイプ処理することも、 InputObject パラメーターを使用して指定することもできます。
Windows PowerShell 3.0 以降では、ForEach-Object コマンドを作成する 2 つの異なる方法があります。
スクリプト ブロック。 スクリプト ブロックを使用して、操作を指定することができます。 スクリプト ブロック内で、 変数を
$_
使用して現在の オブジェクトを表します。 スクリプト ブロックは、Process パラメーターの値です。 スクリプト ブロックには、任意の PowerShell スクリプトを含めることができます。たとえば、次のコマンドでは、コンピューター上の各プロセスの ProcessName プロパティの値を取得します
Get-Process | ForEach-Object {$_.ProcessName}
操作ステートメント。 また、自然言語に似た操作ステートメントを記述することもできます。 操作のステートメントを使用してプロパティの値を指定することも、メソッドを呼び出すこともできます。 操作のステートメントは、Windows PowerShell 3.0 で導入されました。
たとえば、次のコマンドでは、コンピューター上の各プロセスの ProcessName プロパティの値も取得します。
Get-Process | ForEach-Object ProcessName
スクリプト ブロック形式を使用すると、各入力オブジェクトに対して実行される操作を記述したスクリプト ブロックを使用するだけでなく、追加スクリプト ブロックを 2 つ指定できます。 Begin パラメーターの 値である Begin スクリプト ブロックは、このコマンドレットが最初の入力オブジェクトを処理する前に実行されます。 End パラメーターの値である End スクリプト ブロックは、このコマンドレットが最後の入力オブジェクトを処理した後に実行されます。
例
例 1: 配列内の整数を除算する
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
このコマンドは、3 つの整数の配列を受け取り、各整数を 1,024 で除算します。
例 2: ディレクトリ内のすべてのファイルの長さを取得する
Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
このコマンドは、PowerShell インストール ディレクトリ内のファイルとディレクトリ $pshome
を取得し、コマンドレットに ForEach-Object
渡します。
オブジェクトがディレクトリでない場合、スクリプト ブロックはファイルの名前を取得し 、Length プロパティ の値を 1024 で除算し、次のエントリから区切るスペース (" ") を追加します。
このコマンドレットでは 、PSISContainer プロパティを使用して、オブジェクトがディレクトリであるかどうかを判断します。
例 3: 最新のシステム イベントを操作する
$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 という名前のテキスト ファイルを作成し、そのファイル内の各イベントのメッセージ プロパティを格納します。
最後に、End パラメーターは、すべての処理が完了した後の日付と時刻を示すために使用されます。
例 4: レジストリ キーの値を変更する
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
使用して ネットワーク キーのすべてのサブキーを取得し、コマンドレットを Set-ItemProperty
使用して各キーの RemotePath レジストリ エントリの値を変更します。
コマンドの Set-ItemProperty
パスは、レジストリ キーの PSPath プロパティの値です。
これは、レジストリ エントリではなく、レジストリ キーを表す Microsoft .NET Framework オブジェクトのプロパティです。
コマンドは、文字列 (REG_SZ) である RemotePath 値の ToUpper() メソッドを使用します。
は各キーの プロパティを変更するため Set-ItemProperty
、 ForEach-Object
プロパティにアクセスするには コマンドレットが必要です。
例 5: $Null自動変数を使用する
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
この例では、自動変数をコマンドレットにパイプ処理する $Null
効果を ForEach-Object
示します。
PowerShell では null が明示的なプレースホルダーとして扱われるため、 ForEach-Object
コマンドレットは、パイプ先の他のオブジェクトの場合と同様に、 の値 $Null
を生成します。
自動変数の $Null
詳細については、「about_Automatic_Variables」を参照してください。
例 6: プロパティ値を取得する
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
これらのコマンドは、インストールされているすべての PowerShell モジュールの Path プロパティの値を取得します。 これらのコマンドは、MemberName パラメーターを使用して、モジュールの Path プロパティを指定します。
2 番目のコマンドは、1 番目のコマンドと同等です。
コマンドレットの Foreach エイリアスを ForEach-Object
使用し、 MemberName パラメーターの名前を省略します(省略可能)。
コマンドレットは ForEach-Object
、プロパティ値の型を変更する Format コマンドレットや Select-Object
コマンドレットとは異なり、型を変更せずに値を取得するため、プロパティ値を取得する場合に非常に便利です。
例 7: モジュール名をコンポーネント名に分割する
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | Foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host
これらのコマンドは、2 つのドットで区切られたモジュール名をコンポーネント名に分けます。 このコマンドは、文字列の Split メソッドを呼び出します。 3 つのコマンドは、別の構文を使用しますが、すべて同等であり、交換可能です。
最初のコマンドは、スクリプト ブロックと現在のオブジェクト演算子 を含む従来の構文を使用します $_
。
メソッドの指定にドット構文を使用し、区切り記号の引数を囲むためにかっこを使用します。
2 番目のコマンドは、MemberName パラメーターを使用して Split メソッドを指定し、ArgumentName パラメーターを使用してドット (".") を分割の区切り記号として識別します。
3 番目のコマンドは、Foreach-Object コマンドレットの Foreach エイリアスを使用し、MemberName パラメーターと ArgumentList パラメーターの名前を省略します。これは省略可能です。
以下に示す 3 つのコマンドの出力は同一です。
Split は、文字列の多くの便利なメソッドの 1 つに過ぎません。
文字列のすべてのプロパティとメソッドを表示するには、文字列を コマンドレットに Get-Member
パイプします。
パラメーター
-ArgumentList
メソッド呼び出しに対する引数の配列を指定します。
このパラメーターは Windows PowerShell 3.0 で導入されました。
Type: | Object[] |
Aliases: | Args |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Begin
このコマンドレットが入力オブジェクトを処理する前に実行されるスクリプト ブロックを指定します。
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Confirm
コマンドレットの実行前に確認を求めるメッセージが表示されます。
Type: | SwitchParameter |
Aliases: | cf |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-End
このコマンドレットがすべての入力オブジェクトを処理した後に実行されるスクリプト ブロックを指定します。
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InputObject
入力オブジェクトを指定します。
ForEach-Object
は、各入力オブジェクトに対してスクリプト ブロックまたは操作ステートメントを実行します。
オブジェクトが格納されている変数を入力するか、オブジェクトを取得するコマンドまたは式を入力します。
コマンドの結果を にパイプするのではなく、 InputObject パラメーターを と共 ForEach-Object
に ForEach-Object
使用すると、 InputObject 値は 1 つのオブジェクトとして扱われます。
これは、値が コマンドの結果であるコレクションである場合でも当てはまります (例: -InputObject (Get-Process)
)。
InputObject は、配列またはオブジェクトのコレクションから個々のプロパティを返すことができないため、 を使用ForEach-Object
して、定義されたプロパティに特定の値を持つオブジェクトのオブジェクトのコレクションに対して操作を実行する場合は、このトピックの例に示すようにパイプラインで を使用ForEach-Object
することをお勧めします。
Type: | PSObject |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-MemberName
取得するプロパティまたは呼び出すメソッドを指定します。
ワイルドカード文字は使用できますが、結果の文字列が一意の値に解決される場合にのみ機能します。
たとえば、 を実行 Get-Process | ForEach -MemberName *Name
し、 ProcessName プロパティや Name プロパティなどの文字列 Name を含む名前を持つ複数のメンバーが存在する場合、コマンドは失敗します。
このパラメーターは Windows PowerShell 3.0 で導入されました。
Type: | String |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | True |
-Process
各入力オブジェクトに対して実行する操作を指定します。 操作を記述するスクリプト ブロックを入力します。
Type: | ScriptBlock[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-RemainingScripts
Process パラメーターによって取得されないすべてのスクリプト ブロックを指定します。
このパラメーターは Windows PowerShell 3.0 で導入されました。
Type: | ScriptBlock[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-WhatIf
コマンドレットの実行時に発生する内容を示します。 このコマンドレットは実行されません。
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
入力
任意のオブジェクトをこのコマンドレットにパイプできます。
出力
このコマンドレットは、入力によって決定されるオブジェクトを返します。
メモ
- コマンドレットは
ForEach-Object
Foreach ステートメントとよく似ていますが、 Foreach ステートメントに入力をパイプすることはできません。 Foreach ステートメントの詳細については、「about_Foreach」を参照してください。 - PowerShell 4.0 以降では、
Where
コレクションで使用する メソッドとForEach
メソッドが追加されました。 - これらの新しいメソッドの詳細については、こちらを 参照してくださいabout_arrays