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}
ForEach-Object
は、about_functions で説明されているように、begin
、process
、およびend
ブロックをサポートします。Note
スクリプト ブロックは、呼び出し元のスコープで実行されます。 そのため、ブロックはそのスコープ内の変数にアクセスでき、コマンドレットの完了後にそのスコープに保持される新しい変数を作成できます。
Operation ステートメント。 また、自然言語に似た操作ステートメントを記述することもできます。 操作のステートメントを使用してプロパティの値を指定することも、メソッドを呼び出すこともできます。 操作のステートメントは、Windows PowerShell 3.0 で導入されました。
たとえば、次のコマンドは、コンピューター上の各プロセスの ProcessName プロパティの値も取得します。
Get-Process | ForEach-Object ProcessName
例
例 1: 配列内の整数を除算する
この例では、3 つの整数の配列を受け取り、それぞれの整数を 1024 で除算します。
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
例 2: ディレクトリ内のすべてのファイルの長さを取得する
この例では、PowerShell インストール ディレクトリのファイルとディレクトリを $PSHOME
処理します。
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
オブジェクトがディレクトリでない場合、スクリプト ブロックはファイルの名前を取得し、 Length プロパティの値を 1024 で除算し、スペース (" ") を追加して次のエントリから分離します。 コマンドレットは、 PSISContainer プロパティを使用して、オブジェクトがディレクトリであるかどうかを判断します。
例 3: 最新のシステム イベントを操作する
次の使用例は、システム イベント ログから 1000 件の最新のイベントをテキスト ファイルに書き込みます。 現在の時刻は、イベントの処理の前後に表示されます。
Get-EventLog -LogName System -Newest 1000 |
ForEach-Object -Begin {Get-Date} -Process {
Out-File -FilePath Events.txt -Append -InputObject $_.Message
} -End {Get-Date}
Get-EventLog
は、システム イベント ログから最新の 1000 個のイベントを取得し、それらを ForEach-Object
コマンドレットにパイプします。 Begin パラメーターには、現在の日付と時刻が表示されます。 次に、 Process パラメーターは、 Out-File
コマンドレットを使用して、events.txtという名前のテキスト ファイルを作成し、そのファイル内の各イベントのメッセージ プロパティを格納します。 最後に、 End パラメーターは、すべての処理が完了した後の日付と時刻を表示するために使用されます。
例 4: レジストリ キーの値を変更する
次の使用例は、HKCU:\Network
キーの下にあるすべてのサブキーの RemotePath レジストリ エントリの値を大文字のテキストに変更します。
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
このフォーマットを使用して、レジストリ エントリ値の形式や内容を変更することができます。
Network キーの各サブキーは、サインオン時に再接続するマップされたネットワーク ドライブを表します。 RemotePath エントリには、接続されているドライブの UNC パスが含まれています。 たとえば、 E:
ドライブを \\Server\Share
にマップすると、 E サブキーが HKCU:\Network
に作成され、 RemotePath レジストリ値が \\Server\Share
に設定されます。
このコマンドは、 Get-ItemProperty
コマンドレットを使用して、 Network キーのすべてのサブキーを取得し、 Set-ItemProperty
コマンドレットを使用して、各キーの RemotePath レジストリ エントリの値を変更します。 Set-ItemProperty
コマンドでは、パスはレジストリ キーの PSPath プロパティの値です。 これは、レジストリ エントリではなく、レジストリ キーを表す Microsoft .NET Framework オブジェクトのプロパティです。 このコマンドは、文字列REG_SZである RemotePath 値の ToUpper() メソッドを使用します。
Set-ItemProperty
は各キーのプロパティを変更するため、プロパティにアクセスするには ForEach-Object
コマンドレットが必要です。
例 5: $null自動変数を使用する
この例では、 $null
自動変数を ForEach-Object
コマンドレットにパイプ処理する効果を示します。
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
PowerShell は $null
を明示的なプレースホルダーとして扱うため、 ForEach-Object
コマンドレットは、パイプされた他のオブジェクトの場合と同様に、 $null
の値を生成します。
例 6: プロパティ値を取得する
この例では、ForEach-Object
コマンドレットの MemberName パラメーターを使用して、インストールされているすべての PowerShell モジュールの Path プロパティの値を取得します。
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
2 番目のコマンドは、1 番目のコマンドと同等です。 ForEach-Object
コマンドレットのForeach
エイリアスを使用し、省略可能な MemberName パラメーターの名前を省略します。
ForEach-Object
コマンドレットは、Format コマンドレットやプロパティ値の型を変更する Select-Object
コマンドレットとは異なり、型を変更せずに値を取得するため、プロパティ値を取得する場合に便利です。
例 7: モジュール名をコンポーネント名に分割する
この例では、2 つのドット区切りのモジュール名をコンポーネント名に分割する 3 つの方法を示します。 このコマンドは、文字列の Split メソッドを呼び出します。 3 つのコマンドは、別の構文を使用しますが、すべて同等であり、交換可能です。 出力は、3 つのケースすべてで同じです。
"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 番目のコマンドでは、 MemberName パラメーターを使用して、 Split メソッドと ArgumentList パラメーターを指定して、分割区切り記号としてドット (.
) を識別します。
3 番目のコマンドは、ForEach-Object
コマンドレットの Foreach エイリアスを使用し、省略可能な MemberName パラメーターと ArgumentList パラメーターの名前を省略します。
例 8: 2 つのスクリプト ブロックで ForEach-Object を使用する
この例では、2 つのスクリプト ブロックを位置指定して渡します。 すべてのスクリプト ブロックは、 Process パラメーターにバインドされます。 ただし、これらは、 Begin および Process パラメーターに渡されたかのように扱われます。
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
例 9: 2 つ以上のスクリプト ブロックで ForEach-Object を使用する
この例では、4 つのスクリプト ブロックを位置指定して渡します。 すべてのスクリプト ブロックは、 Process パラメーターにバインドされます。 ただし、これらは、 Begin、 Process、および End パラメーターに渡されたかのように扱われます。
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Note
最初のスクリプト ブロックは常に begin
ブロックにマップされ、最後のブロックは end
ブロックにマップされ、2 つの中間ブロックは process
ブロックにマップされます。
例 10: パイプライン項目ごとに複数のスクリプト ブロックを実行する
前の例に示すように、 Process パラメーターを使用して渡された複数のスクリプト ブロックは、 Begin および End パラメーターにマップされます。 このマッピングを回避するには、 Begin および End パラメーターに明示的な値を指定する必要があります。
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
パラメーター
-ArgumentList
メソッド呼び出しに対する引数の配列を指定します。 ArgumentList の動作の詳細については、about_Splattingを参照してください。
このパラメーターは Windows PowerShell 3.0 で導入されました。
型: | Object[] |
Aliases: | Args |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Begin
このコマンドレットが入力オブジェクトを処理する前に実行されるスクリプト ブロックを指定します。 このスクリプト ブロックは、パイプライン全体に対して 1 回だけ実行されます。 begin
ブロックの詳細については、「about_Functions」を参照してください。
型: | ScriptBlock |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Confirm
コマンドレットの実行前に確認を求めるメッセージが表示されます。
型: | SwitchParameter |
Aliases: | cf |
配置: | Named |
規定値: | False |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-End
このコマンドレットがすべての入力オブジェクトを処理した後に実行されるスクリプト ブロックを指定します。 このスクリプト ブロックは、パイプライン全体に対して 1 回だけ実行されます。 end
ブロックの詳細については、「about_Functions」を参照してください。
型: | ScriptBlock |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-InputObject
入力オブジェクトを指定します。 ForEach-Object
は、各入力オブジェクトに対してスクリプト ブロックまたは操作ステートメントを実行します。 オブジェクトが格納されている変数を入力するか、オブジェクトを取得するコマンドまたは式を入力します。
InputObjectパラメーターをForEach-Object
と共に使用すると、コマンドの結果をForEach-Object
にパイプするのではなく、InputObject 値が 1 つのオブジェクトとして扱われます。 これは、値がコマンドの結果であるコレクションである場合でも当てはまります ( -InputObject (Get-Process)
など)。
InputObjectは、配列またはオブジェクトのコレクションから個々のプロパティを返すことはできません。そのため、ForEach-Object
を使用して、定義されたプロパティに特定の値を持つオブジェクトのコレクションに対して操作を実行する場合は、このトピックの例に示すように、パイプラインでForEach-Object
を使用することをお勧めします。
型: | PSObject |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | True |
ワイルドカード文字を受け取る: | False |
-MemberName
取得するメンバー プロパティの名前または呼び出すメンバー メソッドを指定します。 メンバーは、静的メンバーではなく、インスタンス メンバーである必要があります。
ワイルドカード文字は許可されますが、結果の文字列が一意の値に解決される場合にのみ機能します。
たとえば、 Get-Process | ForEach -MemberName *Name
を実行すると、ワイルドカード パターンが複数のメンバーと一致し、コマンドが失敗します。
このパラメーターは Windows PowerShell 3.0 で導入されました。
型: | String |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | True |
-Process
各入力オブジェクトに対して実行される操作を指定します。 このスクリプト ブロックは、パイプライン内のすべてのオブジェクトに対して実行されます。 process
ブロックの詳細については、「about_Functions」を参照してください。
Process パラメーターに複数のスクリプト ブロックを指定すると、最初のスクリプト ブロックは常に begin
ブロックにマップされます。 スクリプト ブロックが 2 つしかない場合、2 番目のブロックは process
ブロックにマップされます。 3 つ以上のスクリプト ブロックがある場合、最初のスクリプト ブロックは常に begin
ブロックにマップされ、最後のブロックは end
ブロックにマップされ、中央のブロックは process
ブロックにマップされます。
型: | ScriptBlock[] |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-RemainingScripts
Process パラメーターによって取得されないすべてのスクリプト ブロックを指定します。
このパラメーターは Windows PowerShell 3.0 で導入されました。
型: | ScriptBlock[] |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-WhatIf
コマンドレットの実行時に発生する内容を示します。 コマンドレットは実行されません。
型: | SwitchParameter |
Aliases: | wi |
配置: | Named |
規定値: | False |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
入力
任意のオブジェクトをこのコマンドレットにパイプできます。
出力
このコマンドレットは、入力によって決定されるオブジェクトを返します。
メモ
Windows PowerShell には、 ForEach-Object
の次のエイリアスが含まれています。
%
foreach
ForEach-Object
コマンドレットは、Foreach ステートメントとよく似ていますが、入力を Foreach ステートメントにパイプすることはできません。 Foreach ステートメントの詳細については、about_Foreachを参照してください。
PowerShell 4.0 以降では、コレクションで使用するために Where
メソッドと ForEach
メソッドが追加されました。 これらの新しいメソッドの詳細については、 about_arrays
関連リンク
PowerShell